Author: Timm Bäder Date: 2023-08-01T10:16:31+02:00 New Revision: 6aac11bad9763dd0ff14637823311187fc3c11a7
URL: https://github.com/llvm/llvm-project/commit/6aac11bad9763dd0ff14637823311187fc3c11a7 DIFF: https://github.com/llvm/llvm-project/commit/6aac11bad9763dd0ff14637823311187fc3c11a7.diff LOG: [clang][Interp] Evaluate Base when discarding a MemberExpr The Base expression might cause side-effects, so we still have to evaluate it. Differential Revision: https://reviews.llvm.org/D149828 Added: Modified: clang/lib/AST/Interp/ByteCodeExprGen.cpp clang/test/AST/Interp/literals.cpp Removed: ################################################################################ diff --git a/clang/lib/AST/Interp/ByteCodeExprGen.cpp b/clang/lib/AST/Interp/ByteCodeExprGen.cpp index fcdfe19bd84439..39dd42655436da 100644 --- a/clang/lib/AST/Interp/ByteCodeExprGen.cpp +++ b/clang/lib/AST/Interp/ByteCodeExprGen.cpp @@ -562,18 +562,18 @@ bool ByteCodeExprGen<Emitter>::VisitUnaryExprOrTypeTraitExpr( template <class Emitter> bool ByteCodeExprGen<Emitter>::VisitMemberExpr(const MemberExpr *E) { - if (DiscardResult) - return true; - // 'Base.Member' const Expr *Base = E->getBase(); - const ValueDecl *Member = E->getMemberDecl(); + + if (DiscardResult) + return this->discard(Base); if (!this->visit(Base)) return false; // Base above gives us a pointer on the stack. // TODO: Implement non-FieldDecl members. + const ValueDecl *Member = E->getMemberDecl(); if (const auto *FD = dyn_cast<FieldDecl>(Member)) { const RecordDecl *RD = FD->getParent(); const Record *R = getRecord(RD); diff --git a/clang/test/AST/Interp/literals.cpp b/clang/test/AST/Interp/literals.cpp index 505ab8fc764f14..6610770a884e21 100644 --- a/clang/test/AST/Interp/literals.cpp +++ b/clang/test/AST/Interp/literals.cpp @@ -876,7 +876,7 @@ constexpr int ignoredDecls() { } static_assert(ignoredDecls() == 12, ""); -struct A{}; +struct A{ int a; }; constexpr int ignoredExprs() { (void)(1 / 2); A a; @@ -908,6 +908,19 @@ constexpr int Comma(int start) { constexpr int Value = Comma(5); static_assert(Value == 8, ""); +/// Ignored MemberExprs need to still evaluate the Base +/// expr. +constexpr A callme(int &i) { + ++i; + return A{}; +} +constexpr int ignoredMemberExpr() { + int i = 0; + callme(i).a; // ref-warning {{result unused}} \ + // expected-warning {{result unused}} + return i; +} +static_assert(ignoredMemberExpr() == 1, ""); #endif namespace PredefinedExprs { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits