From 1b6b92af3538a1dba9ad23123b28de5f81fdaeb7 Mon Sep 17 00:00:00 2001 From: ertugrulfarukpiskin Date: Wed, 18 Jun 2025 16:35:18 +0300 Subject: [PATCH] fix type parameter used in static class Description: Fix Static members cannot reference class type parameters. CTE Issue: https://gitee.com/openharmony/arkcompiler_ets_frontend/issues/IC2V15 Signed-off-by: ertugrulfarukpiskin --- ets2panda/checker/ETSchecker.h | 8 + ets2panda/checker/ets/function.cpp | 141 +++++++- .../ets/generic_arrayaslist-expected.txt | 306 ++++++++++++------ .../test/compiler/ets/generic_arrayaslist.ets | 4 +- ets2panda/util/diagnostic/semantic.yaml | 4 + 5 files changed, 352 insertions(+), 111 deletions(-) diff --git a/ets2panda/checker/ETSchecker.h b/ets2panda/checker/ETSchecker.h index b3ced7b7d3..88754d8822 100644 --- a/ets2panda/checker/ETSchecker.h +++ b/ets2panda/checker/ETSchecker.h @@ -946,6 +946,14 @@ public: // clang-format on } + bool IsInvalidClassOwner(ir::ScriptFunction *func); + void ValidateStaticMethodTypeParameter(ir::ScriptFunction *func, Type *returnType, varbinder::Variable *nameVar, + const util::StringView &funcName); + bool ContainsTypeParameter(Type *type, const std::unordered_set *allowedTypeParams = nullptr); + bool ContainsTypeParameterInUnionType(Type *type, const std::unordered_set *allowedTypeParams); + bool ContainsTypeParameterInObjectType(Type *type, const std::unordered_set *allowedTypeParams); + bool ContainsTypeParameterInFunctionType(Type *type, const std::unordered_set *allowedTypeParams); + private: std::pair GetTargetIdentifierAndType(ir::Identifier *ident); void NotResolvedError(ir::Identifier *const ident, const varbinder::Variable *classVar, diff --git a/ets2panda/checker/ets/function.cpp b/ets2panda/checker/ets/function.cpp index ea80a961c3..58baaa1de9 100644 --- a/ets2panda/checker/ets/function.cpp +++ b/ets2panda/checker/ets/function.cpp @@ -21,7 +21,6 @@ #include "checker/ETSchecker.h" #include "checker/ets/function_helpers.h" #include "checker/ets/typeRelationContext.h" -#include "checker/types/ets/etsAsyncFuncReturnType.h" #include "checker/types/ets/etsObjectType.h" #include "compiler/lowering/scopesInit/scopesInitPhase.h" #include "ir/base/catchClause.h" @@ -32,15 +31,12 @@ #include "ir/base/spreadElement.h" #include "ir/ets/etsFunctionType.h" #include "ir/ets/etsParameterExpression.h" -#include "ir/ets/etsTypeReference.h" -#include "ir/ets/etsTypeReferencePart.h" #include "ir/expressions/arrowFunctionExpression.h" #include "ir/expressions/assignmentExpression.h" #include "ir/expressions/callExpression.h" #include "ir/expressions/functionExpression.h" #include "ir/expressions/identifier.h" #include "ir/expressions/memberExpression.h" -#include "ir/expressions/objectExpression.h" #include "ir/statements/blockStatement.h" #include "ir/statements/doWhileStatement.h" #include "ir/statements/expressionStatement.h" @@ -55,7 +51,6 @@ #include "ir/ts/tsTypeParameterInstantiation.h" #include "parser/program/program.h" #include "util/helpers.h" - #include namespace ark::es2panda::checker { @@ -1633,6 +1628,140 @@ void ETSChecker::ValidateMainSignature(ir::ScriptFunction *func) } } +bool ETSChecker::ContainsTypeParameterInUnionType(Type *type, const std::unordered_set *allowedTypeParams) +{ + for (auto *constituent : type->AsETSUnionType()->ConstituentTypes()) { + if (ContainsTypeParameter(constituent, allowedTypeParams)) { + return true; + } + } + return false; +} + +bool ETSChecker::ContainsTypeParameterInObjectType(Type *type, const std::unordered_set *allowedTypeParams) +{ + for (auto *typeArg : type->AsETSObjectType()->TypeArguments()) { + if (ContainsTypeParameter(typeArg, allowedTypeParams)) { + return true; + } + } + return false; +} + +bool ETSChecker::ContainsTypeParameterInFunctionType(Type *type, + const std::unordered_set *allowedTypeParams) +{ + auto *funcType = type->AsETSFunctionType(); + for (auto *sig : funcType->CallSignaturesOfMethodOrArrow()) { + // Check signature's own type parameters + for (auto *typeParam : sig->GetSignatureInfo()->typeParams) { + if (ContainsTypeParameter(typeParam, allowedTypeParams)) { + return true; + } + } + + // Check return type + if (ContainsTypeParameter(sig->ReturnType(), allowedTypeParams)) { + return true; + } + + // Check parameter types + for (auto *param : sig->Params()) { + if (ContainsTypeParameter(param->TsType(), allowedTypeParams)) { + return true; + } + } + } + return false; +} + +bool ETSChecker::ContainsTypeParameter(Type *type, const std::unordered_set *allowedTypeParams) +{ + if (type == nullptr) { + return false; + } + + if (type->IsETSTypeParameter() && type->HasTypeFlag(TypeFlag::GENERIC)) { + if (allowedTypeParams == nullptr) { + return true; + } + std::string typeName(type->AsETSTypeParameter()->GetOriginal()->Name().Utf8()); + return allowedTypeParams->find(typeName) == allowedTypeParams->end(); + } + + if (type->IsETSUnionType()) { + return ContainsTypeParameterInUnionType(type, allowedTypeParams); + } + + if (type->IsETSObjectType()) { + return ContainsTypeParameterInObjectType(type, allowedTypeParams); + } + + if (type->IsETSArrayType()) { + return ContainsTypeParameter(type->AsETSArrayType()->ElementType(), allowedTypeParams); + } + + if (type->IsETSResizableArrayType()) { + return ContainsTypeParameter(type->AsETSResizableArrayType()->ElementType(), allowedTypeParams); + } + + if (type->IsETSFunctionType()) { + return ContainsTypeParameterInFunctionType(type, allowedTypeParams); + } + + return false; +} + +bool ETSChecker::IsInvalidClassOwner(ir::ScriptFunction *func) +{ + auto owner = func->Signature()->Owner(); + if (owner == nullptr) { + return true; + } + + auto ownerAstNode = owner->GetDeclNode(); + return (ownerAstNode == nullptr || !ownerAstNode->IsClassDefinition() || + owner->Name() == compiler::Signatures::ETS_GLOBAL || + ownerAstNode->AsClassDefinition()->TypeParams() == nullptr || + ownerAstNode->AsClassDefinition()->TypeParams()->Params().empty()); +} + +void ETSChecker::ValidateStaticMethodTypeParameter(ir::ScriptFunction *func, Type *returnType, + varbinder::Variable *nameVar, const util::StringView &funcName) +{ + if (IsInvalidClassOwner(func) || !func->IsStatic() || !nameVar->HasFlag(varbinder::VariableFlags::METHOD) || + func->IsExternal() || func->IsExtensionMethod() || func->IsConstructor() || func->IsAsyncFunc() || + func->IsAsyncImplFunc() || funcName.Utf8().find("lambda$invoke") != std::string::npos) { + return; + } + + // Build a set of method-level type parameter names + std::unordered_set methodTypeParamNames; + if (func->TypeParams() != nullptr) { + for (auto *typeParam : func->TypeParams()->Params()) { + methodTypeParamNames.insert(typeParam->AsTSTypeParameter()->Name()->ToString()); + } + } + + // Check parameters + for (auto *param : func->Params()) { + auto *paramExpr = param->AsETSParameterExpression(); + if (paramExpr->TypeAnnotation() != nullptr) { + auto *paramType = paramExpr->TypeAnnotation()->GetType(this); + if (ContainsTypeParameter(paramType, &methodTypeParamNames)) { + LogError(diagnostic::STATIC_MEMBER_REFERENCE_CLASSTYPE, {}, func->Start()); + return; + } + } + } + + // Check return type + // Only report error if the type parameter is from the containing class + if (ContainsTypeParameter(returnType, &methodTypeParamNames)) { + LogError(diagnostic::STATIC_MEMBER_REFERENCE_CLASSTYPE, func->Start()); + } +} + void ETSChecker::BuildFunctionSignature(ir::ScriptFunction *func, bool isConstructSig) { bool isArrow = func->IsArrow(); @@ -1680,6 +1809,8 @@ void ETSChecker::BuildFunctionSignature(ir::ScriptFunction *func, bool isConstru VarBinder()->AsETSBinder()->BuildFunctionName(func); Program()->AddToFunctionScopes(func->Scope()); + + ValidateStaticMethodTypeParameter(func, returnType, nameVar, funcName); } checker::ETSFunctionType *ETSChecker::BuildMethodType(ir::ScriptFunction *func) diff --git a/ets2panda/test/compiler/ets/generic_arrayaslist-expected.txt b/ets2panda/test/compiler/ets/generic_arrayaslist-expected.txt index dbc3587397..36f61aea19 100644 --- a/ets2panda/test/compiler/ets/generic_arrayaslist-expected.txt +++ b/ets2panda/test/compiler/ets/generic_arrayaslist-expected.txt @@ -21347,7 +21347,7 @@ "type": "ETSTypeReferencePart", "name": { "type": "Identifier", - "name": "T", + "name": "E", "decorators": [], "loc": { "start": { @@ -21418,12 +21418,12 @@ "loc": { "start": { "line": 207, - "column": 36, + "column": 39, "program": "generic_arrayaslist.ets" }, "end": { "line": 207, - "column": 38, + "column": 41, "program": "generic_arrayaslist.ets" } } @@ -21432,12 +21432,12 @@ "loc": { "start": { "line": 207, - "column": 30, + "column": 33, "program": "generic_arrayaslist.ets" }, "end": { "line": 207, - "column": 38, + "column": 41, "program": "generic_arrayaslist.ets" } } @@ -21445,12 +21445,12 @@ "loc": { "start": { "line": 207, - "column": 30, + "column": 33, "program": "generic_arrayaslist.ets" }, "end": { "line": 207, - "column": 38, + "column": 41, "program": "generic_arrayaslist.ets" } } @@ -21465,12 +21465,12 @@ "loc": { "start": { "line": 207, - "column": 43, + "column": 46, "program": "generic_arrayaslist.ets" }, "end": { "line": 207, - "column": 46, + "column": 49, "program": "generic_arrayaslist.ets" } } @@ -21479,12 +21479,12 @@ "loc": { "start": { "line": 207, - "column": 40, + "column": 43, "program": "generic_arrayaslist.ets" }, "end": { "line": 207, - "column": 46, + "column": 49, "program": "generic_arrayaslist.ets" } } @@ -21492,12 +21492,12 @@ "loc": { "start": { "line": 207, - "column": 40, + "column": 43, "program": "generic_arrayaslist.ets" }, "end": { "line": 207, - "column": 46, + "column": 49, "program": "generic_arrayaslist.ets" } } @@ -21512,12 +21512,12 @@ "loc": { "start": { "line": 207, - "column": 51, + "column": 54, "program": "generic_arrayaslist.ets" }, "end": { "line": 207, - "column": 54, + "column": 57, "program": "generic_arrayaslist.ets" } } @@ -21526,12 +21526,12 @@ "loc": { "start": { "line": 207, - "column": 48, + "column": 51, "program": "generic_arrayaslist.ets" }, "end": { "line": 207, - "column": 54, + "column": 57, "program": "generic_arrayaslist.ets" } } @@ -21539,12 +21539,12 @@ "loc": { "start": { "line": 207, - "column": 48, + "column": 51, "program": "generic_arrayaslist.ets" }, "end": { "line": 207, - "column": 54, + "column": 57, "program": "generic_arrayaslist.ets" } } @@ -21568,17 +21568,17 @@ "type": "ETSTypeReferencePart", "name": { "type": "Identifier", - "name": "T", + "name": "E", "decorators": [], "loc": { "start": { "line": 207, - "column": 74, + "column": 77, "program": "generic_arrayaslist.ets" }, "end": { "line": 207, - "column": 75, + "column": 78, "program": "generic_arrayaslist.ets" } } @@ -21586,12 +21586,12 @@ "loc": { "start": { "line": 207, - "column": 74, + "column": 77, "program": "generic_arrayaslist.ets" }, "end": { "line": 207, - "column": 76, + "column": 79, "program": "generic_arrayaslist.ets" } } @@ -21599,12 +21599,12 @@ "loc": { "start": { "line": 207, - "column": 74, + "column": 77, "program": "generic_arrayaslist.ets" }, "end": { "line": 207, - "column": 76, + "column": 79, "program": "generic_arrayaslist.ets" } } @@ -21613,12 +21613,12 @@ "loc": { "start": { "line": 207, - "column": 69, + "column": 72, "program": "generic_arrayaslist.ets" }, "end": { "line": 207, - "column": 76, + "column": 79, "program": "generic_arrayaslist.ets" } } @@ -21626,12 +21626,12 @@ "loc": { "start": { "line": 207, - "column": 69, + "column": 72, "program": "generic_arrayaslist.ets" }, "end": { "line": 207, - "column": 76, + "column": 79, "program": "generic_arrayaslist.ets" } } @@ -21647,17 +21647,17 @@ "type": "ETSTypeReferencePart", "name": { "type": "Identifier", - "name": "T", + "name": "E", "decorators": [], "loc": { "start": { "line": 207, - "column": 82, + "column": 85, "program": "generic_arrayaslist.ets" }, "end": { "line": 207, - "column": 83, + "column": 86, "program": "generic_arrayaslist.ets" } } @@ -21665,12 +21665,12 @@ "loc": { "start": { "line": 207, - "column": 82, + "column": 85, "program": "generic_arrayaslist.ets" }, "end": { "line": 207, - "column": 84, + "column": 87, "program": "generic_arrayaslist.ets" } } @@ -21678,12 +21678,12 @@ "loc": { "start": { "line": 207, - "column": 82, + "column": 85, "program": "generic_arrayaslist.ets" }, "end": { "line": 207, - "column": 84, + "column": 87, "program": "generic_arrayaslist.ets" } } @@ -21692,12 +21692,12 @@ "loc": { "start": { "line": 207, - "column": 77, + "column": 80, "program": "generic_arrayaslist.ets" }, "end": { "line": 207, - "column": 84, + "column": 87, "program": "generic_arrayaslist.ets" } } @@ -21705,12 +21705,12 @@ "loc": { "start": { "line": 207, - "column": 77, + "column": 80, "program": "generic_arrayaslist.ets" }, "end": { "line": 207, - "column": 84, + "column": 87, "program": "generic_arrayaslist.ets" } } @@ -21721,12 +21721,12 @@ "loc": { "start": { "line": 207, - "column": 88, + "column": 91, "program": "generic_arrayaslist.ets" }, "end": { "line": 207, - "column": 95, + "column": 98, "program": "generic_arrayaslist.ets" } } @@ -21734,12 +21734,12 @@ "loc": { "start": { "line": 207, - "column": 68, + "column": 71, "program": "generic_arrayaslist.ets" }, "end": { "line": 207, - "column": 95, + "column": 98, "program": "generic_arrayaslist.ets" } } @@ -21748,12 +21748,12 @@ "loc": { "start": { "line": 207, - "column": 56, + "column": 59, "program": "generic_arrayaslist.ets" }, "end": { "line": 207, - "column": 95, + "column": 98, "program": "generic_arrayaslist.ets" } } @@ -21761,12 +21761,12 @@ "loc": { "start": { "line": 207, - "column": 56, + "column": 59, "program": "generic_arrayaslist.ets" }, "end": { "line": 207, - "column": 95, + "column": 98, "program": "generic_arrayaslist.ets" } } @@ -21777,12 +21777,61 @@ "loc": { "start": { "line": 207, - "column": 98, + "column": 101, "program": "generic_arrayaslist.ets" }, "end": { "line": 207, - "column": 101, + "column": 104, + "program": "generic_arrayaslist.ets" + } + } + }, + "typeParameters": { + "type": "TSTypeParameterDeclaration", + "params": [ + { + "type": "TSTypeParameter", + "name": { + "type": "Identifier", + "name": "E", + "decorators": [], + "loc": { + "start": { + "line": 207, + "column": 30, + "program": "generic_arrayaslist.ets" + }, + "end": { + "line": 207, + "column": 31, + "program": "generic_arrayaslist.ets" + } + } + }, + "loc": { + "start": { + "line": 207, + "column": 30, + "program": "generic_arrayaslist.ets" + }, + "end": { + "line": 207, + "column": 32, + "program": "generic_arrayaslist.ets" + } + } + } + ], + "loc": { + "start": { + "line": 207, + "column": 29, + "program": "generic_arrayaslist.ets" + }, + "end": { + "line": 207, + "column": 32, "program": "generic_arrayaslist.ets" } } @@ -23255,7 +23304,7 @@ "loc": { "start": { "line": 207, - "column": 102, + "column": 105, "program": "generic_arrayaslist.ets" }, "end": { @@ -23390,7 +23439,7 @@ "type": "ETSTypeReferencePart", "name": { "type": "Identifier", - "name": "T", + "name": "E", "decorators": [], "loc": { "start": { @@ -23461,12 +23510,12 @@ "loc": { "start": { "line": 225, - "column": 37, + "column": 40, "program": "generic_arrayaslist.ets" }, "end": { "line": 225, - "column": 39, + "column": 42, "program": "generic_arrayaslist.ets" } } @@ -23475,12 +23524,12 @@ "loc": { "start": { "line": 225, - "column": 31, + "column": 34, "program": "generic_arrayaslist.ets" }, "end": { "line": 225, - "column": 39, + "column": 42, "program": "generic_arrayaslist.ets" } } @@ -23488,12 +23537,12 @@ "loc": { "start": { "line": 225, - "column": 31, + "column": 34, "program": "generic_arrayaslist.ets" }, "end": { "line": 225, - "column": 39, + "column": 42, "program": "generic_arrayaslist.ets" } } @@ -23508,12 +23557,12 @@ "loc": { "start": { "line": 225, - "column": 44, + "column": 47, "program": "generic_arrayaslist.ets" }, "end": { "line": 225, - "column": 47, + "column": 50, "program": "generic_arrayaslist.ets" } } @@ -23522,12 +23571,12 @@ "loc": { "start": { "line": 225, - "column": 41, + "column": 44, "program": "generic_arrayaslist.ets" }, "end": { "line": 225, - "column": 47, + "column": 50, "program": "generic_arrayaslist.ets" } } @@ -23535,12 +23584,12 @@ "loc": { "start": { "line": 225, - "column": 41, + "column": 44, "program": "generic_arrayaslist.ets" }, "end": { "line": 225, - "column": 47, + "column": 50, "program": "generic_arrayaslist.ets" } } @@ -23555,12 +23604,12 @@ "loc": { "start": { "line": 225, - "column": 52, + "column": 55, "program": "generic_arrayaslist.ets" }, "end": { "line": 225, - "column": 55, + "column": 58, "program": "generic_arrayaslist.ets" } } @@ -23569,12 +23618,12 @@ "loc": { "start": { "line": 225, - "column": 49, + "column": 52, "program": "generic_arrayaslist.ets" }, "end": { "line": 225, - "column": 55, + "column": 58, "program": "generic_arrayaslist.ets" } } @@ -23582,12 +23631,12 @@ "loc": { "start": { "line": 225, - "column": 49, + "column": 52, "program": "generic_arrayaslist.ets" }, "end": { "line": 225, - "column": 55, + "column": 58, "program": "generic_arrayaslist.ets" } } @@ -23611,17 +23660,17 @@ "type": "ETSTypeReferencePart", "name": { "type": "Identifier", - "name": "T", + "name": "E", "decorators": [], "loc": { "start": { "line": 225, - "column": 75, + "column": 78, "program": "generic_arrayaslist.ets" }, "end": { "line": 225, - "column": 76, + "column": 79, "program": "generic_arrayaslist.ets" } } @@ -23629,12 +23678,12 @@ "loc": { "start": { "line": 225, - "column": 75, + "column": 78, "program": "generic_arrayaslist.ets" }, "end": { "line": 225, - "column": 77, + "column": 80, "program": "generic_arrayaslist.ets" } } @@ -23642,12 +23691,12 @@ "loc": { "start": { "line": 225, - "column": 75, + "column": 78, "program": "generic_arrayaslist.ets" }, "end": { "line": 225, - "column": 77, + "column": 80, "program": "generic_arrayaslist.ets" } } @@ -23656,12 +23705,12 @@ "loc": { "start": { "line": 225, - "column": 70, + "column": 73, "program": "generic_arrayaslist.ets" }, "end": { "line": 225, - "column": 77, + "column": 80, "program": "generic_arrayaslist.ets" } } @@ -23669,12 +23718,12 @@ "loc": { "start": { "line": 225, - "column": 70, + "column": 73, "program": "generic_arrayaslist.ets" }, "end": { "line": 225, - "column": 77, + "column": 80, "program": "generic_arrayaslist.ets" } } @@ -23690,17 +23739,17 @@ "type": "ETSTypeReferencePart", "name": { "type": "Identifier", - "name": "T", + "name": "E", "decorators": [], "loc": { "start": { "line": 225, - "column": 83, + "column": 86, "program": "generic_arrayaslist.ets" }, "end": { "line": 225, - "column": 84, + "column": 87, "program": "generic_arrayaslist.ets" } } @@ -23708,12 +23757,12 @@ "loc": { "start": { "line": 225, - "column": 83, + "column": 86, "program": "generic_arrayaslist.ets" }, "end": { "line": 225, - "column": 85, + "column": 88, "program": "generic_arrayaslist.ets" } } @@ -23721,12 +23770,12 @@ "loc": { "start": { "line": 225, - "column": 83, + "column": 86, "program": "generic_arrayaslist.ets" }, "end": { "line": 225, - "column": 85, + "column": 88, "program": "generic_arrayaslist.ets" } } @@ -23735,12 +23784,12 @@ "loc": { "start": { "line": 225, - "column": 78, + "column": 81, "program": "generic_arrayaslist.ets" }, "end": { "line": 225, - "column": 85, + "column": 88, "program": "generic_arrayaslist.ets" } } @@ -23748,12 +23797,12 @@ "loc": { "start": { "line": 225, - "column": 78, + "column": 81, "program": "generic_arrayaslist.ets" }, "end": { "line": 225, - "column": 85, + "column": 88, "program": "generic_arrayaslist.ets" } } @@ -23764,12 +23813,12 @@ "loc": { "start": { "line": 225, - "column": 89, + "column": 92, "program": "generic_arrayaslist.ets" }, "end": { "line": 225, - "column": 96, + "column": 99, "program": "generic_arrayaslist.ets" } } @@ -23777,12 +23826,12 @@ "loc": { "start": { "line": 225, - "column": 69, + "column": 72, "program": "generic_arrayaslist.ets" }, "end": { "line": 225, - "column": 96, + "column": 99, "program": "generic_arrayaslist.ets" } } @@ -23791,12 +23840,12 @@ "loc": { "start": { "line": 225, - "column": 57, + "column": 60, "program": "generic_arrayaslist.ets" }, "end": { "line": 225, - "column": 96, + "column": 99, "program": "generic_arrayaslist.ets" } } @@ -23804,12 +23853,12 @@ "loc": { "start": { "line": 225, - "column": 57, + "column": 60, "program": "generic_arrayaslist.ets" }, "end": { "line": 225, - "column": 96, + "column": 99, "program": "generic_arrayaslist.ets" } } @@ -23820,12 +23869,61 @@ "loc": { "start": { "line": 225, - "column": 99, + "column": 102, + "program": "generic_arrayaslist.ets" + }, + "end": { + "line": 225, + "column": 106, + "program": "generic_arrayaslist.ets" + } + } + }, + "typeParameters": { + "type": "TSTypeParameterDeclaration", + "params": [ + { + "type": "TSTypeParameter", + "name": { + "type": "Identifier", + "name": "E", + "decorators": [], + "loc": { + "start": { + "line": 225, + "column": 31, + "program": "generic_arrayaslist.ets" + }, + "end": { + "line": 225, + "column": 32, + "program": "generic_arrayaslist.ets" + } + } + }, + "loc": { + "start": { + "line": 225, + "column": 31, + "program": "generic_arrayaslist.ets" + }, + "end": { + "line": 225, + "column": 33, + "program": "generic_arrayaslist.ets" + } + } + } + ], + "loc": { + "start": { + "line": 225, + "column": 30, "program": "generic_arrayaslist.ets" }, "end": { "line": 225, - "column": 103, + "column": 33, "program": "generic_arrayaslist.ets" } } @@ -24835,7 +24933,7 @@ "loc": { "start": { "line": 225, - "column": 104, + "column": 107, "program": "generic_arrayaslist.ets" }, "end": { diff --git a/ets2panda/test/compiler/ets/generic_arrayaslist.ets b/ets2panda/test/compiler/ets/generic_arrayaslist.ets index 608ec8ad7f..6ff3605d68 100644 --- a/ets2panda/test/compiler/ets/generic_arrayaslist.ets +++ b/ets2panda/test/compiler/ets/generic_arrayaslist.ets @@ -204,7 +204,7 @@ class ArrayAsListt implements Listt { } - private static partition(arr: T[], l: int, r: int, comparator: (lhs: T, rhs: T) => boolean): int { + private static partition(arr: E[], l: int, r: int, comparator: (lhs: E, rhs: E) => boolean): int { let last = r - 1; let pivot = arr[last]; let lessInd = l - 1; @@ -222,7 +222,7 @@ class ArrayAsListt implements Listt { return lessInd + 1; } - private static bubbleSort(arr: T[], l: int, r: int, comparator: (lhs: T, rhs: T) => boolean): void { + private static bubbleSort(arr: E[], l: int, r: int, comparator: (lhs: E, rhs: E) => boolean): void { for (let i = l; i < r; ++i) { for (let j = i; j < r - i; ++j) { if (comparator(arr[j + 1], arr[j])) { diff --git a/ets2panda/util/diagnostic/semantic.yaml b/ets2panda/util/diagnostic/semantic.yaml index 568a3b7312..86243481f5 100644 --- a/ets2panda/util/diagnostic/semantic.yaml +++ b/ets2panda/util/diagnostic/semantic.yaml @@ -1498,3 +1498,7 @@ semantic: - name: INTERFACE_EXTENDS_CLASS id: 373 message: "Interfaces cannot extend classes, only other interfaces." + +- name: STATIC_MEMBER_REFERENCE_CLASSTYPE + id: 378 + message: "Static members cannot reference class type parameters." -- Gitee