tbaeder updated this revision to Diff 520352. tbaeder added a comment. @aaron.ballman This is where the sizeof/alignof tests were actually broken.
CHANGES SINCE LAST ACTION https://reviews.llvm.org/D149965/new/ 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 @@ -196,6 +196,21 @@ // ref-error {{must be initialized by a constant expression}} } +#if __cplusplus >= 201402L + constexpr int IgnoredRejected() { // ref-error {{never produces a constant expression}} + int n = 0; + sizeof(int[n++]); // expected-warning {{expression result unused}} \ + // ref-warning {{expression result unused}} \ + // ref-note 2{{subexpression not valid in a constant expression}} + return n; + } + /// FIXME: This is rejected because the parameter so sizeof() is not constant. + /// produce a proper diagnostic. + static_assert(IgnoredRejected() == 0, ""); // expected-error {{not an integral constant expression}} \ + // ref-error {{not an integral constant expression}} \ + // ref-note {{in call to 'IgnoredRejected()'}} +#endif + #if __cplusplus >= 202002L /// FIXME: The following code should be accepted. @@ -886,7 +901,7 @@ struct A{ int a; }; constexpr int ignoredExprs() { (void)(1 / 2); - A a; + A a{12}; a; (void)a; (a); @@ -902,9 +917,12 @@ arr[0]; "a"; 'b'; + sizeof(int); + alignof(int); return 0; } + static_assert(ignoredExprs() == 0, ""); constexpr int oh_my(int x) { (int){ x++ }; 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: @@ -588,6 +590,9 @@ Size = ASTCtx.getTypeSizeInChars(ArgType); } + if (DiscardResult) + return true; + return this->emitConst(Size.getQuantity(), E); } @@ -618,6 +623,9 @@ Size = AlignOfType(Arg->getType(), ASTCtx, Kind); } + if (DiscardResult) + return true; + return this->emitConst(Size.getQuantity(), E); }
Index: clang/test/AST/Interp/literals.cpp =================================================================== --- clang/test/AST/Interp/literals.cpp +++ clang/test/AST/Interp/literals.cpp @@ -196,6 +196,21 @@ // ref-error {{must be initialized by a constant expression}} } +#if __cplusplus >= 201402L + constexpr int IgnoredRejected() { // ref-error {{never produces a constant expression}} + int n = 0; + sizeof(int[n++]); // expected-warning {{expression result unused}} \ + // ref-warning {{expression result unused}} \ + // ref-note 2{{subexpression not valid in a constant expression}} + return n; + } + /// FIXME: This is rejected because the parameter so sizeof() is not constant. + /// produce a proper diagnostic. + static_assert(IgnoredRejected() == 0, ""); // expected-error {{not an integral constant expression}} \ + // ref-error {{not an integral constant expression}} \ + // ref-note {{in call to 'IgnoredRejected()'}} +#endif + #if __cplusplus >= 202002L /// FIXME: The following code should be accepted. @@ -886,7 +901,7 @@ struct A{ int a; }; constexpr int ignoredExprs() { (void)(1 / 2); - A a; + A a{12}; a; (void)a; (a); @@ -902,9 +917,12 @@ arr[0]; "a"; 'b'; + sizeof(int); + alignof(int); return 0; } + static_assert(ignoredExprs() == 0, ""); constexpr int oh_my(int x) { (int){ x++ }; 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: @@ -588,6 +590,9 @@ Size = ASTCtx.getTypeSizeInChars(ArgType); } + if (DiscardResult) + return true; + return this->emitConst(Size.getQuantity(), E); } @@ -618,6 +623,9 @@ Size = AlignOfType(Arg->getType(), ASTCtx, Kind); } + if (DiscardResult) + return true; + return this->emitConst(Size.getQuantity(), E); }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits