From: Erich Keane Date: Thu, 19 Oct 2017 15:58:58 +0000 (+0000) Subject: Fix nodiscard for volatile references X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9d5150b14a04c50ca295942b0db82d8757389180;p=clang Fix nodiscard for volatile references As reported here https://bugs.llvm.org/show_bug.cgi?id=34988 [[nodiscard]] warnings were not being suppressed for volatile-ref return values. Differential Revision: https://reviews.llvm.org/D39075 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@316166 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp index e8aa8f3d33..6cda82b2b0 100644 --- a/lib/AST/Expr.cpp +++ b/lib/AST/Expr.cpp @@ -2298,7 +2298,8 @@ bool Expr::isUnusedResultAWarning(const Expr *&WarnE, SourceLocation &Loc, const DeclRefExpr *DRE = dyn_cast(CE->getSubExpr()->IgnoreParens()); if (!(DRE && isa(DRE->getDecl()) && - cast(DRE->getDecl())->hasLocalStorage())) { + cast(DRE->getDecl())->hasLocalStorage()) && + !isa(CE->getSubExpr()->IgnoreParens())) { return CE->getSubExpr()->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx); } diff --git a/test/CXX/dcl.dcl/dcl.attr/dcl.attr.nodiscard/p2.cpp b/test/CXX/dcl.dcl/dcl.attr/dcl.attr.nodiscard/p2.cpp index 072f5e74aa..49c418a687 100644 --- a/test/CXX/dcl.dcl/dcl.attr/dcl.attr.nodiscard/p2.cpp +++ b/test/CXX/dcl.dcl/dcl.attr/dcl.attr.nodiscard/p2.cpp @@ -9,21 +9,33 @@ enum [[nodiscard]] E {}; E get_e(); [[nodiscard]] int get_i(); +[[nodiscard]] volatile int &get_vi(); void f() { get_s(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}} get_i(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}} + get_vi(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}} get_e(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}} // Okay, warnings are not encouraged get_s_ref(); (void)get_s(); (void)get_i(); + (void)get_vi(); (void)get_e(); } +[[nodiscard]] volatile char &(*fp)(); +void g() { + fp(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}} + + // OK, warning suppressed. + (void)fp(); +} #ifdef EXT // expected-warning@4 {{use of the 'nodiscard' attribute is a C++17 extension}} // expected-warning@8 {{use of the 'nodiscard' attribute is a C++17 extension}} // expected-warning@11 {{use of the 'nodiscard' attribute is a C++17 extension}} +// expected-warning@12 {{use of the 'nodiscard' attribute is a C++17 extension}} +// expected-warning@28 {{use of the 'nodiscard' attribute is a C++17 extension}} #endif