Index: clang/lib/AST/Interp/ByteCodeExprGen.cpp =================================================================== --- clang/lib/AST/Interp/ByteCodeExprGen.cpp +++ clang/lib/AST/Interp/ByteCodeExprGen.cpp @@ -1132,11 +1132,16 @@ template bool ByteCodeExprGen::VisitCXXThisExpr(const CXXThisExpr *E) { + if (DiscardResult) + return true; return this->emitThis(E); } template bool ByteCodeExprGen::VisitUnaryOperator(const UnaryOperator *E) { + if (DiscardResult) + return true; + const Expr *SubExpr = E->getSubExpr(); switch (E->getOpcode()) { Index: clang/test/AST/Interp/literals.cpp =================================================================== --- clang/test/AST/Interp/literals.cpp +++ clang/test/AST/Interp/literals.cpp @@ -279,6 +279,17 @@ static_assert((12 | true) == 13, ""); }; + +#if __cplusplus >= 201402L +constexpr bool IgnoredUnary() { + bool bo = true; + !bo; // expected-warning {{expression result unused}} \ + // ref-warning {{expression result unused}} + return bo; +} +static_assert(IgnoredUnary(), ""); +#endif + namespace floats { constexpr int i = 2; constexpr float f = 1.0f; Index: clang/test/AST/Interp/records.cpp =================================================================== --- clang/test/AST/Interp/records.cpp +++ clang/test/AST/Interp/records.cpp @@ -204,6 +204,21 @@ // expected-error {{static assertion failed}} \ // expected-note {{evaluates to '12 == 200'}} + +struct S { + constexpr void fo() const { + this; // expected-warning {{expression result unused}} \ + // ref-warning {{expression result unused}} + } + + constexpr int m() const { + fo(); + return 1; + } +}; +constexpr S s; +static_assert(s.m() == 1, ""); + namespace MI { class A { public: