From 1a45f615efe12634fbb42f6b609cdfaea8f0adb3 Mon Sep 17 00:00:00 2001 From: Zelentsov Dmitry Date: Mon, 14 Jul 2025 10:44:54 +0300 Subject: [PATCH] Support Error Type handling Issue: https://gitee.com/openharmony/arkcompiler_ets_frontend/issues/ICLVSX Tests: use Test-U-Runner and CI Signed-off-by: Zelentsov Dmitry --- ets2panda/checker/ETSAnalyzer.cpp | 41 +++++------------ ets2panda/checker/ETSAnalyzerHelpers.cpp | 6 +-- ets2panda/checker/ETSchecker.cpp | 2 +- ets2panda/checker/ETSchecker.h | 2 +- ets2panda/checker/ets/arithmetic.cpp | 46 ++++++------------- .../checker/types/ets/etsTypeParameter.cpp | 2 +- .../checker/types/ets/etsTypeParameter.h | 2 +- ets2panda/checker/types/ets/etsUnionType.cpp | 4 +- ets2panda/checker/types/ets/etsUnionType.h | 4 +- ets2panda/checker/types/type.h | 8 ++++ ets2panda/checker/types/typeError.h | 38 +++++++++++++++ ets2panda/compiler/lowering/checkerPhase.cpp | 14 ++++-- .../lowering/ets/genericBridgesLowering.cpp | 2 +- .../lowering/ets/genericBridgesLowering.h | 2 +- ets2panda/driver/dependency_analyzer/BUILD.gn | 1 + .../driver/dependency_analyzer/CMakeLists.txt | 4 +- ets2panda/parser/ETSparserEnums.cpp | 3 -- ets2panda/test/CMakeLists.txt | 4 +- ets2panda/test/unit/lsp/navigate_to_test.cpp | 6 +-- 19 files changed, 106 insertions(+), 85 deletions(-) diff --git a/ets2panda/checker/ETSAnalyzer.cpp b/ets2panda/checker/ETSAnalyzer.cpp index f027da79aa..d6b0e21592 100644 --- a/ets2panda/checker/ETSAnalyzer.cpp +++ b/ets2panda/checker/ETSAnalyzer.cpp @@ -27,7 +27,7 @@ #include "checker/types/ets/etsAsyncFuncReturnType.h" #include "types/ts/nullType.h" #include "types/type.h" -#include "types/typeFlag.h" +#include "checker/types/typeError.h" #include "util/es2pandaMacros.h" #include @@ -557,9 +557,8 @@ static checker::Type *CheckInstantiatedNewType(ETSChecker *checker, ir::ETSNewCl { checker::Type *res = expr->GetTypeRef()->Check(checker); auto calleeType = res->MaybeBaseTypeOfGradualType(); - if (calleeType->IsTypeError()) { - return checker->InvalidateType(expr->GetTypeRef()); - } + FORWARD_TYPE_ERROR(calleeType, expr->GetTypeRef(), checker); + if (calleeType->IsETSUnionType()) { return checker->TypeError(expr->GetTypeRef(), diagnostic::UNION_NONCONSTRUCTIBLE, expr->Start()); } @@ -595,11 +594,11 @@ checker::Type *ETSAnalyzer::Check(ir::ETSNewClassInstanceExpression *expr) const if (expr->TsType() != nullptr) { return expr->TsType(); } + ETSChecker *checker = GetETSChecker(); auto *calleeType = CheckInstantiatedNewType(checker, expr); - if (calleeType->IsTypeError()) { - return checker->InvalidateType(expr); - } + FORWARD_TYPE_ERROR(calleeType, expr, checker); + auto *calleeObj = calleeType->MaybeBaseTypeOfGradualType()->AsETSObjectType(); expr->SetTsType(calleeType); @@ -1667,16 +1666,14 @@ checker::Type *ETSAnalyzer::Check(ir::CallExpression *expr) const CheckCallee(checker, expr); checker::TypeStackElement tse(checker, expr, {{diagnostic::CYCLIC_CALLEE, {}}}, expr->Start()); - if (tse.HasTypeError()) { - expr->SetTsType(checker->GlobalTypeError()); - return checker->GlobalTypeError(); - } + ERROR_SANITY_CHECK(!tse.HasTypeError(), return expr->SetTsType(checker->GlobalTypeError()), checker); checker::Type *const returnType = GetCallExpressionReturnType(expr, calleeType); expr->SetTsType(returnType); if (returnType->IsTypeError()) { return returnType; } + if (calleeType->IsETSArrowType()) { expr->SetUncheckedType(checker->GuaranteedTypeForUncheckedCast( checker->GlobalETSAnyType(), checker->MaybeBoxType(expr->Signature()->ReturnType()))); @@ -1689,11 +1686,6 @@ checker::Type *ETSAnalyzer::Check(ir::CallExpression *expr) const checker->ComputeApparentType(returnType); } - if (returnType->IsTypeError()) { - expr->SetTsType(returnType); - return expr->TsType(); - } - CheckVoidTypeExpression(checker, expr); CheckAbstractCall(checker, expr); return expr->TsType(); @@ -2759,9 +2751,7 @@ checker::Type *ETSAnalyzer::Check(ir::UpdateExpression *expr) const } checker::Type *operandType = expr->argument_->Check(checker); - if (operandType->IsTypeError()) { - return checker->InvalidateType(expr); - } + FORWARD_TYPE_ERROR(operandType, expr, checker); if (expr->Argument()->IsIdentifier()) { checker->ValidateUnaryOperatorOperand(expr->Argument()->AsIdentifier()->Variable()); @@ -3702,17 +3692,12 @@ checker::Type *ETSAnalyzer::Check(ir::TSAsExpression *expr) const checker->CheckAnnotations(expr->TypeAnnotation()->Annotations()); auto *const targetType = expr->TypeAnnotation()->AsTypeNode()->GetType(checker); - ES2PANDA_ASSERT(targetType != nullptr); - if (targetType->IsTypeError()) { - return checker->InvalidateType(expr); - } + FORWARD_TYPE_ERROR(targetType, expr, checker); expr->Expr()->SetPreferredType(targetType); auto const sourceType = expr->Expr()->Check(checker); - if (sourceType->IsTypeError()) { - return checker->InvalidateType(expr); - } + FORWARD_TYPE_ERROR(sourceType, expr, checker); if (sourceType->DefinitelyETSNullish() && !targetType->PossiblyETSNullish()) { return expr->SetTsType(checker->TypeError(expr, diagnostic::NULLISH_CAST_TO_NONNULLISH, expr->Start())); @@ -3758,9 +3743,7 @@ checker::Type *ETSAnalyzer::Check(ir::TSInterfaceDeclaration *st) const auto *stmtType = checker->BuildBasicInterfaceProperties(st); ES2PANDA_ASSERT(stmtType != nullptr); - if (stmtType->IsTypeError()) { - return st->SetTsType(stmtType); - } + FORWARD_TYPE_ERROR(stmtType, st, checker); auto *interfaceType = stmtType->IsGradualType() ? stmtType->AsGradualType()->GetBaseType()->AsETSObjectType() : stmtType->AsETSObjectType(); diff --git a/ets2panda/checker/ETSAnalyzerHelpers.cpp b/ets2panda/checker/ETSAnalyzerHelpers.cpp index 295eaa49b5..42c578a983 100644 --- a/ets2panda/checker/ETSAnalyzerHelpers.cpp +++ b/ets2panda/checker/ETSAnalyzerHelpers.cpp @@ -15,6 +15,7 @@ #include "ETSAnalyzerHelpers.h" #include "checker/types/ets/etsAsyncFuncReturnType.h" +#include "checker/types/typeError.h" namespace ark::es2panda::checker { @@ -514,10 +515,7 @@ ArenaVector GetUnionTypeSignatures(ETSChecker *checker, ch void ProcessExclamationMark(ETSChecker *checker, ir::UnaryExpression *expr, checker::Type *operandType) { - if (operandType == nullptr || operandType->IsTypeError()) { - expr->SetTsType(checker->GlobalTypeError()); - return; - } + FORWARD_VALUE_ON_TYPE_ERROR(operandType, expr, EMPTY_VALUE, checker); expr->SetTsType(checker->GlobalETSBooleanBuiltinType()); } diff --git a/ets2panda/checker/ETSchecker.cpp b/ets2panda/checker/ETSchecker.cpp index f04eba7c2b..357cb630b6 100644 --- a/ets2panda/checker/ETSchecker.cpp +++ b/ets2panda/checker/ETSchecker.cpp @@ -768,7 +768,7 @@ void ETSChecker::HandleUpdatedCallExpressionNode(ir::CallExpression *callExpr) VarBinder()->AsETSBinder()->HandleCustomNodes(callExpr); } -Type *ETSChecker::SelectGlobalIntegerTypeForNumeric(Type *type) const noexcept +Type *ETSChecker::SelectGlobalIntegerTypeForNumeric(Type *type) const { if (type->IsETSObjectType()) { auto const *objectType = type->AsETSObjectType(); diff --git a/ets2panda/checker/ETSchecker.h b/ets2panda/checker/ETSchecker.h index 40549ea102..2792690666 100644 --- a/ets2panda/checker/ETSchecker.h +++ b/ets2panda/checker/ETSchecker.h @@ -730,7 +730,7 @@ public: bool IsExtensionAccessorFunctionType(const checker::Type *type); bool IsArrayExprSizeValidForTuple(const ir::ArrayExpression *arrayExpr, const ETSTupleType *tuple); void ModifyPreferredType(ir::ArrayExpression *arrayExpr, Type *newPreferredType); - Type *SelectGlobalIntegerTypeForNumeric(Type *type) const noexcept; + Type *SelectGlobalIntegerTypeForNumeric(Type *type) const; ir::ClassProperty *ClassPropToImplementationProp(ir::ClassProperty *classProp, varbinder::ClassScope *scope); ir::Expression *GenerateImplicitInstantiateArg(const std::string &className); diff --git a/ets2panda/checker/ets/arithmetic.cpp b/ets2panda/checker/ets/arithmetic.cpp index b76c779b5a..442533d4f3 100644 --- a/ets2panda/checker/ets/arithmetic.cpp +++ b/ets2panda/checker/ets/arithmetic.cpp @@ -16,6 +16,7 @@ #include "arithmetic.h" #include "checker/types/globalTypesHolder.h" +#include "checker/types/typeError.h" #include "lexer/token/token.h" namespace ark::es2panda::checker { @@ -322,9 +323,7 @@ checker::Type *ETSChecker::CheckBinaryOperatorMulDivMod( // Try to handle errors on a lower level RepairTypeErrorsInOperands(&leftType, &rightType); RepairTypeErrorsInOperands(&unboxedL, &unboxedR); - if (leftType->IsTypeError()) { // both are errors - return GlobalTypeError(); - } + ERROR_TYPE_CHECK(leftType, return GlobalTypeError(), this); auto const promotedType = BinaryGetPromotedType(this, leftType, rightType, !isEqualOp); if (!CheckBinaryPlusMultDivOperandsForUnionType(leftType, rightType, left, right)) { @@ -390,9 +389,7 @@ checker::Type *ETSChecker::CheckBinaryOperatorPlus( // Try to handle errors on a lower level RepairTypeErrorsInOperands(&leftType, &rightType); RepairTypeErrorsInOperands(&unboxedL, &unboxedR); - if (leftType->IsTypeError()) { // both are errors - return GlobalTypeError(); - } + ERROR_TYPE_CHECK(leftType, return GlobalTypeError(), this); if (leftType->IsETSStringType() || rightType->IsETSStringType()) { if (operationType == lexer::TokenType::PUNCTUATOR_MINUS || @@ -502,9 +499,7 @@ checker::Type *ETSChecker::CheckBinaryOperatorBitwise( RepairTypeErrorsInOperands(&leftType, &rightType); RepairTypeErrorsInOperands(&unboxedL, &unboxedR); - if (leftType->IsTypeError()) { // both are errors - return GlobalTypeError(); - } + ERROR_TYPE_CHECK(leftType, return GlobalTypeError(), this); if (leftType->IsETSUnionType() || rightType->IsETSUnionType()) { LogError(diagnostic::BINOP_UNION, {}, pos); @@ -548,9 +543,8 @@ checker::Type *ETSChecker::CheckBinaryOperatorLogical(ir::Expression *left, ir:: { RepairTypeErrorsInOperands(&leftType, &rightType); RepairTypeErrorsInOperands(&unboxedL, &unboxedR); - if (leftType->IsTypeError()) { // both are errors - return GlobalTypeError(); - } + ERROR_TYPE_CHECK(leftType, return GlobalTypeError(), this); + // Don't do any boxing for primitive type when another operand is Enum. Enum will become primitive type later. if (leftType->IsETSEnumType() || rightType->IsETSEnumType()) { left->RemoveAstNodeFlags(ir::AstNodeFlags::GENERATE_VALUE_OF); @@ -658,10 +652,8 @@ std::tuple ETSChecker::CheckBinaryOperatorStrictEqual(ir::Expres checker::Type *leftType, checker::Type *rightType) { RepairTypeErrorsInOperands(&leftType, &rightType); - if (leftType->IsTypeError()) { // both are errors - // We still know that operation result should be boolean, so recover. - return {GlobalETSBooleanType(), GlobalETSObjectType()}; - } + // We still know that operation result should be boolean, so recover. + ERROR_TYPE_CHECK(leftType, return std::make_tuple(GlobalETSBooleanBuiltinType(), GlobalETSObjectType()), this); checker::Type *tsType {}; if (!IsReferenceType(leftType) || !IsReferenceType(rightType)) { @@ -718,9 +710,7 @@ static Type *CheckBinaryOperatorEqual(ETSChecker *checker, BinaryArithmOperands { [[maybe_unused]] auto const [expr, typeL, typeR, reducedL, reducedR] = ops; - if (typeL->IsTypeError()) { // both are errors - return checker->GlobalTypeError(); - } + ERROR_TYPE_CHECK(typeL, return checker->GlobalTypeError(), checker); if (reducedL->IsETSBooleanType() && reducedR->IsETSBooleanType()) { if (reducedL->IsConstantType() && reducedR->IsConstantType()) { @@ -766,9 +756,7 @@ std::tuple ETSChecker::CheckBinaryOperatorLessGreater(ir::Expres { RepairTypeErrorsInOperands(&leftType, &rightType); RepairTypeErrorsInOperands(&unboxedL, &unboxedR); - if (leftType->IsTypeError()) { // both are errors - return {GlobalETSBooleanBuiltinType(), GlobalTypeError()}; - } + ERROR_TYPE_CHECK(leftType, return std::make_tuple(GlobalETSBooleanBuiltinType(), GlobalTypeError()), this); if ((leftType->IsETSUnionType() || rightType->IsETSUnionType()) && operationType != lexer::TokenType::PUNCTUATOR_EQUAL && @@ -806,9 +794,7 @@ std::tuple ETSChecker::CheckBinaryOperatorInstanceOf(lexer::Sour checker::Type *rightType) { RepairTypeErrorsInOperands(&leftType, &rightType); - if (leftType->IsTypeError()) { // both are errors - return {GlobalETSBooleanBuiltinType(), GlobalTypeError()}; - } + ERROR_TYPE_CHECK(leftType, return std::make_tuple(GlobalETSBooleanBuiltinType(), GlobalTypeError()), this); if (leftType->IsETSPrimitiveType() || rightType->IsETSPrimitiveType()) { LogError(diagnostic::BINOP_NOT_SAME, {}, pos); @@ -920,15 +906,13 @@ Type *ETSChecker::CheckBinaryOperatorNullishCoalescing(ir::Expression *left, ir: lexer::SourcePosition pos) { auto *leftType = left->TsType(); + leftType = GetNonNullishType(leftType); + + ERROR_TYPE_CHECK(leftType, return GlobalTypeError(), this); + if (leftType->IsETSPrimitiveType()) { LogError(diagnostic::COALESCE_NOT_REF, {}, pos); } - leftType = GetNonNullishType(leftType); - ES2PANDA_ASSERT(leftType != nullptr); - if (leftType->IsTypeError()) { - ES2PANDA_ASSERT(IsAnyError()); - return GlobalTypeError(); - } auto *rightType = MaybeBoxType(right->TsType()); if (IsTypeIdenticalTo(leftType, rightType)) { diff --git a/ets2panda/checker/types/ets/etsTypeParameter.cpp b/ets2panda/checker/types/ets/etsTypeParameter.cpp index ebb370321d..ec7fc34040 100644 --- a/ets2panda/checker/types/ets/etsTypeParameter.cpp +++ b/ets2panda/checker/types/ets/etsTypeParameter.cpp @@ -158,7 +158,7 @@ void ETSTypeParameter::ToDebugInfoType(std::stringstream &ss) const GetConstraintType()->ToDebugInfoType(ss); } -ETSTypeParameter *ETSTypeParameter::GetOriginal() const noexcept +ETSTypeParameter *ETSTypeParameter::GetOriginal() const { return GetDeclNode()->Name()->Variable()->TsType()->AsETSTypeParameter(); } diff --git a/ets2panda/checker/types/ets/etsTypeParameter.h b/ets2panda/checker/types/ets/etsTypeParameter.h index d38b1b7b1d..7eb6908b4b 100644 --- a/ets2panda/checker/types/ets/etsTypeParameter.h +++ b/ets2panda/checker/types/ets/etsTypeParameter.h @@ -38,7 +38,7 @@ public: return declNode_; } - [[nodiscard]] ETSTypeParameter *GetOriginal() const noexcept; + [[nodiscard]] ETSTypeParameter *GetOriginal() const; [[nodiscard]] util::StringView const &Name() const noexcept; void SetDefaultType(Type *type) noexcept diff --git a/ets2panda/checker/types/ets/etsUnionType.cpp b/ets2panda/checker/types/ets/etsUnionType.cpp index 3bfeecc8cc..3d105ba385 100644 --- a/ets2panda/checker/types/ets/etsUnionType.cpp +++ b/ets2panda/checker/types/ets/etsUnionType.cpp @@ -351,7 +351,7 @@ void ETSUnionType::CheckVarianceRecursively(TypeRelation *relation, VarianceFlag // ATTENTION! When calling this method we assume that 'AssignmentTarget(...)' check was passes successfully, // thus the required assignable type (or corresponding supertype) always exists. checker::Type *ETSUnionType::GetAssignableType(checker::ETSChecker *checker, checker::Type *sourceType, - [[maybe_unused]] std::optional value) const noexcept + [[maybe_unused]] std::optional value) const { for (auto *ctype : ConstituentTypes()) { if (checker->Relation()->IsSupertypeOf(ctype, sourceType)) { @@ -380,7 +380,7 @@ checker::Type *ETSUnionType::GetAssignableType(checker::ETSChecker *checker, che checker::Type *ETSUnionType::GetAssignableBuiltinType( checker::ETSChecker *checker, checker::ETSObjectType *sourceType, - std::map &numericTypes) const noexcept + std::map &numericTypes) const { for (auto *constituentType : constituentTypes_) { if (!constituentType->IsETSObjectType() && !constituentType->IsETSTupleType()) { diff --git a/ets2panda/checker/types/ets/etsUnionType.h b/ets2panda/checker/types/ets/etsUnionType.h index 71c9ac8601..0ae2e8a38b 100644 --- a/ets2panda/checker/types/ets/etsUnionType.h +++ b/ets2panda/checker/types/ets/etsUnionType.h @@ -85,7 +85,7 @@ public: } [[nodiscard]] checker::Type *GetAssignableType(ETSChecker *checker, checker::Type *sourceType, - std::optional value) const noexcept; + std::optional value) const; [[nodiscard]] std::pair GetComplimentaryType(ETSChecker *checker, checker::Type *sourceType); @@ -102,7 +102,7 @@ private: [[nodiscard]] checker::Type *GetAssignableBuiltinType( checker::ETSChecker *checker, checker::ETSObjectType *sourceType, - std::map &numericTypes) const noexcept; + std::map &numericTypes) const; void CanonicalizedAssemblerType(ETSChecker *checker); void InitAssemblerTypeCache(ETSChecker *checker); diff --git a/ets2panda/checker/types/type.h b/ets2panda/checker/types/type.h index 3840d6ab66..d82b067de5 100644 --- a/ets2panda/checker/types/type.h +++ b/ets2panda/checker/types/type.h @@ -79,12 +79,20 @@ public: /* CC-OFFNXT(G.PRE.02) name part*/ \ typeName *As##typeName() \ { \ + if (IsTypeError()) { \ + LOG(INFO, ES2PANDA) << "Erroneous cast to '" << #typeName << "' type."; \ + throw std::exception(); \ + } \ ES2PANDA_ASSERT(Is##typeName()); \ /* CC-OFFNXT(G.PRE.05) The macro is used to generate a function. Return is needed*/ \ return reinterpret_cast(this); /* CC-OFF(G.PRE.02) name part*/ \ } \ const typeName *As##typeName() const \ { \ + if (IsTypeError()) { \ + LOG(INFO, ES2PANDA) << "Erroneous cast to '" << #typeName << "' type."; \ + throw std::exception(); \ + } \ ES2PANDA_ASSERT(Is##typeName()); \ /* CC-OFFNXT(G.PRE.05) The macro is used to generate a function. Return is needed*/ \ return reinterpret_cast(this); \ diff --git a/ets2panda/checker/types/typeError.h b/ets2panda/checker/types/typeError.h index 9b2d87c407..906ead0f48 100644 --- a/ets2panda/checker/types/typeError.h +++ b/ets2panda/checker/types/typeError.h @@ -46,4 +46,42 @@ public: } // namespace ark::es2panda::checker +// NOLINTBEGIN(cppcoreguidelines-macro-usage) +#define EMPTY_VALUE + +// CC-OFFNXT(G.PRE.02-CPP) TypeError handling macro definition +#define ERROR_SANITY_CHECK(test, whatIfFails, etsChecker) \ + if (!(test)) { \ + ES2PANDA_ASSERT((etsChecker)->IsAnyError()); \ + whatIfFails; \ + } + +// CC-OFFNXT(G.PRE.02-CPP) TypeError handling macro definition +#define ERROR_TYPE_CHECK(testType, whatIfError, etsChecker) \ + ES2PANDA_ASSERT((testType) != nullptr); \ + if ((testType)->IsTypeError()) { \ + ES2PANDA_ASSERT((etsChecker)->IsAnyError()); \ + whatIfError; \ + } + +// CC-OFFNXT(G.PRE.02-CPP) TypeError handling macro definition +#define FORWARD_TYPE_ERROR(testType, target, etsChecker) \ + ES2PANDA_ASSERT((testType) != nullptr); \ + if ((testType)->IsTypeError()) { \ + ES2PANDA_ASSERT((etsChecker)->IsAnyError()); \ + /* CC-OFFNXT(G.PRE.05) error handling. */ \ + return (target)->SetTsType((etsChecker)->GlobalTypeError()); \ + } + +// CC-OFFNXT(G.PRE.02-CPP) TypeError handling macro definition +#define FORWARD_VALUE_ON_TYPE_ERROR(testType, target, value, etsChecker) \ + ES2PANDA_ASSERT((testType) != nullptr); \ + if ((testType)->IsTypeError()) { \ + ES2PANDA_ASSERT((etsChecker)->IsAnyError()); \ + (target)->SetTsType((etsChecker)->GlobalTypeError()); \ + /* CC-OFFNXT(G.PRE.05) error handling. */ \ + return value; \ + } +// NOLINTEND(cppcoreguidelines-macro-usage) + #endif diff --git a/ets2panda/compiler/lowering/checkerPhase.cpp b/ets2panda/compiler/lowering/checkerPhase.cpp index e6b73d36a4..d01f5603ed 100644 --- a/ets2panda/compiler/lowering/checkerPhase.cpp +++ b/ets2panda/compiler/lowering/checkerPhase.cpp @@ -48,8 +48,16 @@ bool CheckerPhase::Perform(public_lib::Context *ctx, [[maybe_unused]] parser::Pr for (auto stmt : program->Ast()->Statements()) { stmt->AddAstNodeFlags(ir::AstNodeFlags::NOCLEANUP); } - auto checkerResult = ctx->GetChecker()->StartChecker(ctx->parserProgram->VarBinder(), *ctx->config->options); - return program->Extension() == ScriptExtension::ETS ? true : checkerResult; -} + if (program->Extension() == ScriptExtension::ETS) { + try { + ctx->GetChecker()->StartChecker(ctx->parserProgram->VarBinder(), *ctx->config->options); + } catch (std::exception &e) { + // nothing to do - just to avoid program crash + } + return true; + } + + return ctx->GetChecker()->StartChecker(ctx->parserProgram->VarBinder(), *ctx->config->options); +} } // namespace ark::es2panda::compiler diff --git a/ets2panda/compiler/lowering/ets/genericBridgesLowering.cpp b/ets2panda/compiler/lowering/ets/genericBridgesLowering.cpp index e74ea9ce95..528c9a0ef3 100644 --- a/ets2panda/compiler/lowering/ets/genericBridgesLowering.cpp +++ b/ets2panda/compiler/lowering/ets/genericBridgesLowering.cpp @@ -264,7 +264,7 @@ void GenericBridgesPhase::CreateGenericBridges(ir::ClassDefinition const *const } GenericBridgesPhase::Substitutions GenericBridgesPhase::GetSubstitutions( - checker::ETSObjectType const *const objectType, ArenaVector const &typeParameters) const noexcept + checker::ETSObjectType const *const objectType, ArenaVector const &typeParameters) const { auto const &typeArguments = objectType->TypeArguments(); auto const parameterNumber = typeParameters.size(); diff --git a/ets2panda/compiler/lowering/ets/genericBridgesLowering.h b/ets2panda/compiler/lowering/ets/genericBridgesLowering.h index c9b64c44d1..a15c7ed01d 100644 --- a/ets2panda/compiler/lowering/ets/genericBridgesLowering.h +++ b/ets2panda/compiler/lowering/ets/genericBridgesLowering.h @@ -42,7 +42,7 @@ private: ArenaVector const &interfaces) const; Substitutions GetSubstitutions(checker::ETSObjectType const *const objectType, - ArenaVector const &typeParameters) const noexcept; + ArenaVector const &typeParameters) const; void CreateGenericBridges(ir::ClassDefinition const *classDefinition, Substitutions &substitutions, ArenaVector const &items) const; diff --git a/ets2panda/driver/dependency_analyzer/BUILD.gn b/ets2panda/driver/dependency_analyzer/BUILD.gn index 96449c6f58..1fc7d9fa53 100644 --- a/ets2panda/driver/dependency_analyzer/BUILD.gn +++ b/ets2panda/driver/dependency_analyzer/BUILD.gn @@ -62,6 +62,7 @@ ohos_executable("dependency_analyzer") { sdk_libc_secshared_dep, ] + use_exceptions = true libs = platform_libs ldflags = platform_ldflags if (is_linux) { diff --git a/ets2panda/driver/dependency_analyzer/CMakeLists.txt b/ets2panda/driver/dependency_analyzer/CMakeLists.txt index 7801000201..9a5380dd87 100644 --- a/ets2panda/driver/dependency_analyzer/CMakeLists.txt +++ b/ets2panda/driver/dependency_analyzer/CMakeLists.txt @@ -11,6 +11,8 @@ # See the License for the specific language governing permissions and # limitations under the License. +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fexceptions") + set(DEP_ANALYZER_SRC dep_analyzer.cpp ) @@ -39,4 +41,4 @@ panda_target_compile_options(dependency_analyzer PRIVATE -Werror=shadow ) -panda_add_sanitizers(TARGET dependency_analyzer SANITIZERS ${PANDA_SANITIZERS_LIST}) \ No newline at end of file +panda_add_sanitizers(TARGET dependency_analyzer SANITIZERS ${PANDA_SANITIZERS_LIST}) diff --git a/ets2panda/parser/ETSparserEnums.cpp b/ets2panda/parser/ETSparserEnums.cpp index 56be9b2749..4c1f6f7c26 100644 --- a/ets2panda/parser/ETSparserEnums.cpp +++ b/ets2panda/parser/ETSparserEnums.cpp @@ -148,9 +148,6 @@ ir::Statement *ETSParser::ParsePotentialConstEnum(VariableParsingFlags flags) return ParseEnumDeclaration(false); } -// NOLINTBEGIN(cert-err58-cpp) -// NOLINTEND(cert-err58-cpp) - ir::TSEnumDeclaration *ETSParser::ParseEnumMembers(ir::Identifier *const key, const lexer::SourcePosition &enumStart, const bool isConst, const bool isStatic) { diff --git a/ets2panda/test/CMakeLists.txt b/ets2panda/test/CMakeLists.txt index 7694d4828f..4f93b770d7 100644 --- a/ets2panda/test/CMakeLists.txt +++ b/ets2panda/test/CMakeLists.txt @@ -29,6 +29,8 @@ if(PANDA_TARGET_ARM32 OR PANDA_ARM64_TESTS_WITH_SANITIZER) return() endif() +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fexceptions") + add_custom_target(es2panda_tests COMMENT "Running es2panda test suites") add_custom_target(es2panda_gtests COMMENT "Running es2panda gtest suites") set(DEFAULT_TEST_GROUP ets_tests) @@ -87,4 +89,4 @@ endif() add_subdirectory(tsconfig) add_subdirectory(options) add_subdirectory(unit) -add_subdirectory(depanalyzer) \ No newline at end of file +add_subdirectory(depanalyzer) diff --git a/ets2panda/test/unit/lsp/navigate_to_test.cpp b/ets2panda/test/unit/lsp/navigate_to_test.cpp index c6153efb6c..b62f7fa44c 100644 --- a/ets2panda/test/unit/lsp/navigate_to_test.cpp +++ b/ets2panda/test/unit/lsp/navigate_to_test.cpp @@ -51,7 +51,7 @@ protected: contexts_.push_back(ctx); } }; - // NOLINTBEGIN(fuchsia-statically-constructed-objects) + // NOLINTBEGIN(fuchsia-statically-constructed-objects, cert-err58-cpp) static inline std::vector contexts_ = {}; static inline Initializer *initializer_ = nullptr; static inline std::vector files_ = {{"ExactPrefixAndSubstringMatch1.sts", R"( @@ -81,7 +81,7 @@ protected: } } )"}}; - // NOLINTEND(fuchsia-statically-constructed-objects) + // NOLINTEND(fuchsia-statically-constructed-objects, cert-err58-cpp) }; TEST_F(NavigateToTest, ExactMatchFromSingleFile) @@ -256,4 +256,4 @@ TEST_F(NavigateToTest, MatchOnClassMember) ASSERT_EQ(results[0].containerName, containerName); } -} // namespace \ No newline at end of file +} // namespace -- Gitee