diff options
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/AST/Expr.cpp | 11 | ||||
-rw-r--r-- | clang/test/SemaCXX/warn-unused-value.cpp | 20 |
2 files changed, 30 insertions, 1 deletions
diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp index 8473c096afe..5c1a27da365 100644 --- a/clang/lib/AST/Expr.cpp +++ b/clang/lib/AST/Expr.cpp @@ -2075,8 +2075,17 @@ bool Expr::isUnusedResultAWarning(const Expr *&WarnE, SourceLocation &Loc, return false; case CXXTemporaryObjectExprClass: - case CXXConstructExprClass: + case CXXConstructExprClass: { + if (const CXXRecordDecl *Type = getType()->getAsCXXRecordDecl()) { + if (Type->hasAttr<WarnUnusedAttr>()) { + WarnE = this; + Loc = getLocStart(); + R1 = getSourceRange(); + return true; + } + } return false; + } case ObjCMessageExprClass: { const ObjCMessageExpr *ME = cast<ObjCMessageExpr>(this); diff --git a/clang/test/SemaCXX/warn-unused-value.cpp b/clang/test/SemaCXX/warn-unused-value.cpp index 072ee60f1f3..5e43d3ec042 100644 --- a/clang/test/SemaCXX/warn-unused-value.cpp +++ b/clang/test/SemaCXX/warn-unused-value.cpp @@ -49,3 +49,23 @@ namespace test2 { } } +namespace test3 { +struct Used { + Used(); + Used(int); + Used(int, int); +}; +struct __attribute__((warn_unused)) Unused { + Unused(); + Unused(int); + Unused(int, int); +}; +void f() { + Used(); + Used(1); + Used(1, 1); + Unused(); // expected-warning {{expression result unused}} + Unused(1); // expected-warning {{expression result unused}} + Unused(1, 1); // expected-warning {{expression result unused}} +} +} |