diff --git a/clang/lib/AST/ByteCode/Compiler.cpp b/clang/lib/AST/ByteCode/Compiler.cpp index 7afae97f308ad..750516efa1a3e 100644 --- a/clang/lib/AST/ByteCode/Compiler.cpp +++ b/clang/lib/AST/ByteCode/Compiler.cpp @@ -253,6 +253,9 @@ bool Compiler::VisitCastExpr(const CastExpr *CE) { case CK_UncheckedDerivedToBase: case CK_DerivedToBase: { + if (DiscardResult) + return this->discard(SubExpr); + if (!this->delegate(SubExpr)) return false; @@ -282,6 +285,9 @@ bool Compiler::VisitCastExpr(const CastExpr *CE) { } case CK_BaseToDerived: { + if (DiscardResult) + return this->discard(SubExpr); + if (!this->delegate(SubExpr)) return false; diff --git a/clang/test/AST/ByteCode/records.cpp b/clang/test/AST/ByteCode/records.cpp index d329219264d89..9470e7d8e3dcb 100644 --- a/clang/test/AST/ByteCode/records.cpp +++ b/clang/test/AST/ByteCode/records.cpp @@ -1684,3 +1684,18 @@ namespace ExplicitThisInTemporary { constexpr bool g(B b) { return &b == b.p; } static_assert(g({}), ""); } + +namespace IgnoredMemberExpr { + class A { + public: + int a; + }; + class B : public A { + public: + constexpr int foo() { + a; // both-warning {{expression result unused}} + return 0; + } + }; + static_assert(B{}.foo() == 0, ""); +}