tbaeder created this revision. tbaeder added reviewers: aaron.ballman, tahonermann, shafik, erichkeane. Herald added a project: All. tbaeder requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
We didn't call the function explicitly in a static_assert() statement and the checkPotentialConstantExpression() invocation quietly aborted early because of the missing initializer for A::a. Fix this by calling ignoredExprs() explicitly. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D149965 Files: clang/lib/AST/Interp/ByteCodeExprGen.cpp clang/test/AST/Interp/literals.cpp Index: clang/test/AST/Interp/literals.cpp =================================================================== --- clang/test/AST/Interp/literals.cpp +++ clang/test/AST/Interp/literals.cpp @@ -886,7 +886,7 @@ struct A{ int a; }; constexpr int ignoredExprs() { (void)(1 / 2); - A a; + A a{12}; a; (void)a; (a); @@ -906,6 +906,7 @@ return 0; } + static_assert(ignoredExprs() == 0, ""); /// Ignored comma expressions still have their /// expressions evaluated. Index: clang/lib/AST/Interp/ByteCodeExprGen.cpp =================================================================== --- clang/lib/AST/Interp/ByteCodeExprGen.cpp +++ clang/lib/AST/Interp/ByteCodeExprGen.cpp @@ -200,6 +200,8 @@ case CK_NoOp: case CK_UserDefinedConversion: case CK_BitCast: + if (DiscardResult) + return this->discard(SubExpr); return this->visit(SubExpr); case CK_IntegralToBoolean: @@ -573,6 +575,8 @@ template <class Emitter> bool ByteCodeExprGen<Emitter>::VisitUnaryExprOrTypeTraitExpr( const UnaryExprOrTypeTraitExpr *E) { + if (DiscardResult) + return true; UnaryExprOrTypeTrait Kind = E->getKind(); ASTContext &ASTCtx = Ctx.getASTContext();
Index: clang/test/AST/Interp/literals.cpp =================================================================== --- clang/test/AST/Interp/literals.cpp +++ clang/test/AST/Interp/literals.cpp @@ -886,7 +886,7 @@ struct A{ int a; }; constexpr int ignoredExprs() { (void)(1 / 2); - A a; + A a{12}; a; (void)a; (a); @@ -906,6 +906,7 @@ return 0; } + static_assert(ignoredExprs() == 0, ""); /// Ignored comma expressions still have their /// expressions evaluated. Index: clang/lib/AST/Interp/ByteCodeExprGen.cpp =================================================================== --- clang/lib/AST/Interp/ByteCodeExprGen.cpp +++ clang/lib/AST/Interp/ByteCodeExprGen.cpp @@ -200,6 +200,8 @@ case CK_NoOp: case CK_UserDefinedConversion: case CK_BitCast: + if (DiscardResult) + return this->discard(SubExpr); return this->visit(SubExpr); case CK_IntegralToBoolean: @@ -573,6 +575,8 @@ template <class Emitter> bool ByteCodeExprGen<Emitter>::VisitUnaryExprOrTypeTraitExpr( const UnaryExprOrTypeTraitExpr *E) { + if (DiscardResult) + return true; UnaryExprOrTypeTrait Kind = E->getKind(); ASTContext &ASTCtx = Ctx.getASTContext();
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits