diff --git a/clang/lib/AST/Interp/ByteCodeExprGen.cpp b/clang/lib/AST/Interp/ByteCodeExprGen.cpp --- a/clang/lib/AST/Interp/ByteCodeExprGen.cpp +++ b/clang/lib/AST/Interp/ByteCodeExprGen.cpp @@ -476,6 +476,8 @@ template bool ByteCodeExprGen::VisitSubstNonTypeTemplateParmExpr( const SubstNonTypeTemplateParmExpr *E) { + if (DiscardResult) + return this->discard(E->getReplacement()); return this->visit(E->getReplacement()); } diff --git a/clang/test/AST/Interp/literals.cpp b/clang/test/AST/Interp/literals.cpp --- a/clang/test/AST/Interp/literals.cpp +++ b/clang/test/AST/Interp/literals.cpp @@ -876,51 +876,62 @@ } static_assert(ignoredDecls() == 12, ""); -struct A{ int a; }; -constexpr int ignoredExprs() { - (void)(1 / 2); - A a; - a; // expected-warning {{unused}} \ - // ref-warning {{unused}} - (void)a; - (a); // expected-warning {{unused}} \ - // ref-warning {{unused}} - - (void)5, (void)6; - - 1 ? 0 : 1; // expected-warning {{unused}} \ - // ref-warning {{unused}} - /// Ignored MaterializeTemporaryExpr. - struct B{ const int &a; }; - (void)B{12}; - return 0; -} +namespace DiscardExprs { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunused-value" + + struct A{ int a; }; + constexpr int ignoredExprs() { + (void)(1 / 2); + A a; + a; + (void)a; + (a); + + /// Ignored MaterializeTemporaryExpr. + struct B{ const int &a; }; + (void)B{12}; + + (void)5, (void)6; -/// Ignored comma expressions still have their -/// expressions evaluated. -constexpr int Comma(int start) { - int i = start; + 1 ? 0 : 1; + return 0; + } + + /// Ignored comma expressions still have their + /// expressions evaluated. + constexpr int Comma(int start) { + int i = start; - (void)i++; - (void)i++,(void)i++; + (void)i++; + (void)i++,(void)i++; + return i; + } + 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; return i; + } + static_assert(ignoredMemberExpr() == 1, ""); + + template + constexpr int foo() { + I; + return I; + } + static_assert(foo<3>() == 3, ""); + +#pragma clang diagnostic pop } -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 {