erichkeane created this revision. As reported here https://bugs.llvm.org/show_bug.cgi?id=34988 [[nodiscard]] warnings were not being suppressed for volatile-ref return values.
https://reviews.llvm.org/D39075 Files: lib/AST/Expr.cpp test/CXX/dcl.dcl/dcl.attr/dcl.attr.nodiscard/p2.cpp Index: lib/AST/Expr.cpp =================================================================== --- lib/AST/Expr.cpp +++ lib/AST/Expr.cpp @@ -2298,7 +2298,8 @@ const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(CE->getSubExpr()->IgnoreParens()); if (!(DRE && isa<VarDecl>(DRE->getDecl()) && - cast<VarDecl>(DRE->getDecl())->hasLocalStorage())) { + cast<VarDecl>(DRE->getDecl())->hasLocalStorage()) && + !isa<CallExpr>(CE->getSubExpr()->IgnoreParens())) { return CE->getSubExpr()->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx); } Index: test/CXX/dcl.dcl/dcl.attr/dcl.attr.nodiscard/p2.cpp =================================================================== --- test/CXX/dcl.dcl/dcl.attr/dcl.attr.nodiscard/p2.cpp +++ test/CXX/dcl.dcl/dcl.attr/dcl.attr.nodiscard/p2.cpp @@ -9,21 +9,25 @@ 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(); } #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}} #endif
Index: lib/AST/Expr.cpp =================================================================== --- lib/AST/Expr.cpp +++ lib/AST/Expr.cpp @@ -2298,7 +2298,8 @@ const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(CE->getSubExpr()->IgnoreParens()); if (!(DRE && isa<VarDecl>(DRE->getDecl()) && - cast<VarDecl>(DRE->getDecl())->hasLocalStorage())) { + cast<VarDecl>(DRE->getDecl())->hasLocalStorage()) && + !isa<CallExpr>(CE->getSubExpr()->IgnoreParens())) { return CE->getSubExpr()->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx); } Index: test/CXX/dcl.dcl/dcl.attr/dcl.attr.nodiscard/p2.cpp =================================================================== --- test/CXX/dcl.dcl/dcl.attr/dcl.attr.nodiscard/p2.cpp +++ test/CXX/dcl.dcl/dcl.attr/dcl.attr.nodiscard/p2.cpp @@ -9,21 +9,25 @@ 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(); } #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}} #endif
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits