For classes that have the warn_unused_result attribute, don't apply the
authorKaelyn Uhrain <rikka@google.com>
Tue, 13 Nov 2012 21:23:31 +0000 (21:23 +0000)
committerKaelyn Uhrain <rikka@google.com>
Tue, 13 Nov 2012 21:23:31 +0000 (21:23 +0000)
attribute to the class' methods even when they return an instance of the
class (e.g. assignment operators).

llvm-svn: 167873

clang/lib/Sema/SemaDecl.cpp
clang/test/SemaCXX/warn-unused-result.cpp

index f2e8404..04f66e5 100644 (file)
@@ -5696,7 +5696,11 @@ Sema::ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC,
       RetType->getAsCXXRecordDecl() : RetType->getPointeeCXXRecordDecl();
   if (!NewFD->isInvalidDecl() && !NewFD->hasAttr<WarnUnusedResultAttr>() &&
       Ret && Ret->hasAttr<WarnUnusedResultAttr>()) {
-    NewFD->addAttr(new (Context) WarnUnusedResultAttr(SourceRange(), Context));
+    const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(NewFD);
+    if (!(MD && MD->getCorrespondingMethodInClass(Ret, true))) {
+      NewFD->addAttr(new (Context) WarnUnusedResultAttr(SourceRange(),
+                                                        Context));
+    }
   }
 
   if (!getLangOpts().CPlusPlus) {
index 5ce0f98..b0bf61f 100644 (file)
@@ -46,6 +46,12 @@ void bah() {
 namespace warn_unused_CXX11 {
 struct [[clang::warn_unused_result]] Status {
   bool ok() const;
+  Status& operator=(const Status& x);
+  inline void Update(const Status& new_status) {
+    if (ok()) {
+      *this = new_status; //no-warning
+    }
+  }
 };
 Status DoSomething();
 Status& DoSomethingElse();