diff --git a/ets2panda/checker/ETSAnalyzer.cpp b/ets2panda/checker/ETSAnalyzer.cpp index 799a853597b618f32ebf5f47fa8211dbbcf78714..a7e926e7ae17a32c3df5388f935a334c38b45d01 100644 --- a/ets2panda/checker/ETSAnalyzer.cpp +++ b/ets2panda/checker/ETSAnalyzer.cpp @@ -1655,16 +1655,28 @@ static Type *TransformTypeForMethodReference(ETSChecker *checker, ir::Expression return type; // type is actually used as method } - if (type->AsETSFunctionType()->CallSignatures().at(0)->HasSignatureFlag(SignatureFlags::PRIVATE)) { + auto *const functionType = type->AsETSFunctionType(); + auto &signatures = functionType->CallSignatures(); + + if (signatures.at(0)->HasSignatureFlag(SignatureFlags::PRIVATE)) { checker->LogError(diagnostic::PRIVATE_METHOD_AS_VALUE, getUseSite()); return checker->GlobalTypeError(); } - if (type->AsETSFunctionType()->CallSignatures().size() > 1) { + auto it = signatures.begin(); + while (it != signatures.end()) { + if ((*it)->HasSignatureFlag(SignatureFlags::ABSTRACT)) { + it = signatures.erase(it); + } else { + ++it; + } + } + + if (signatures.size() > 1U) { checker->LogError(diagnostic::OVERLOADED_METHOD_AS_VALUE, getUseSite()); return checker->GlobalTypeError(); } - return type->AsETSFunctionType()->MethodToArrow(checker); + return functionType->MethodToArrow(checker); } checker::Type *ETSAnalyzer::Check(ir::Identifier *expr) const diff --git a/ets2panda/test/ast/parser/ets/recordKeyTypeCheck02.ets b/ets2panda/test/ast/parser/ets/recordKeyTypeCheck02.ets index d1e722c345b64754e7b731c22b194ae783720456..a8af2cbfaa172f72ffa6780b027189a3d0119f22 100644 --- a/ets2panda/test/ast/parser/ets/recordKeyTypeCheck02.ets +++ b/ets2panda/test/ast/parser/ets/recordKeyTypeCheck02.ets @@ -21,4 +21,4 @@ function main(){ 2: 2 } } -/* @@@ label Error TypeError: Type argument 'A|Double' should be a subtype of 'Numeric|String'-constraint */ +/* @@@ label Error TypeError: Type argument 'A|Double' should be a subtype of 'Numeric|String|BaseEnum'-constraint */ diff --git a/ets2panda/test/ast/parser/ets/recordKeyTypeCheck03.ets b/ets2panda/test/ast/parser/ets/recordKeyTypeCheck03.ets index 70e71e1254487900c189573b3e14983ad604963a..a1fcd36cfb467123731471a084a61a92706c7d77 100644 --- a/ets2panda/test/ast/parser/ets/recordKeyTypeCheck03.ets +++ b/ets2panda/test/ast/parser/ets/recordKeyTypeCheck03.ets @@ -18,4 +18,4 @@ class A{} function main(){ let a: Record/* @@ label */ } -/* @@@ label Error TypeError: Type argument 'BigInt' should be a subtype of 'Numeric|String'-constraint */ +/* @@@ label Error TypeError: Type argument 'BigInt' should be a subtype of 'Numeric|String|BaseEnum'-constraint */