]> granicus.if.org Git - clang/commitdiff
Consumed analysis: non-const methods no longer transfer an object into an
authorDeLesley Hutchins <delesley@google.com>
Thu, 29 Aug 2013 21:17:25 +0000 (21:17 +0000)
committerDeLesley Hutchins <delesley@google.com>
Thu, 29 Aug 2013 21:17:25 +0000 (21:17 +0000)
unknown state.  Patch by chris.wailes@gmail.com.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@189612 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/Consumed.cpp
test/SemaCXX/warn-consumed-analysis-strict.cpp
test/SemaCXX/warn-consumed-analysis.cpp

index 745840d7a1128049566dc8eb48cbecd34d0d84ef..e5231e07c284e81d7ba0329a6df5ef2466400eb1 100644 (file)
@@ -530,8 +530,6 @@ void ConsumedStmtVisitor::VisitCXXMemberCallExpr(
         handleTestingFunctionCall(Call, PInfo.getVar());
       else if (MethodDecl->hasAttr<ConsumesAttr>())
         StateMap->setState(PInfo.getVar(), consumed::CS_Consumed);
-      else if (!MethodDecl->isConst())
-        StateMap->setState(PInfo.getVar(), consumed::CS_Unknown);
     }
   }
 }
@@ -626,18 +624,10 @@ void ConsumedStmtVisitor::VisitCXXOperatorCallExpr(
       checkCallability(PInfo, FunDecl, Call);
       
       if (PInfo.isVar()) {
-        if (isTestingFunction(FunDecl)) {
+        if (isTestingFunction(FunDecl))
           handleTestingFunctionCall(Call, PInfo.getVar());
-          
-        } else if (FunDecl->hasAttr<ConsumesAttr>()) {
+        else if (FunDecl->hasAttr<ConsumesAttr>())
           StateMap->setState(PInfo.getVar(), consumed::CS_Consumed);
-          
-        } else if (const CXXMethodDecl *MethodDecl =
-                     dyn_cast_or_null<CXXMethodDecl>(FunDecl)) {
-          
-          if (!MethodDecl->isConst())
-            StateMap->setState(PInfo.getVar(), consumed::CS_Unknown);
-        }
       }
     }
   }
index 474f35cf32b862a21858788c3d12526a763f6100..c3b254d781d6a0f56241f53dcb511ead360361f8 100644 (file)
@@ -20,7 +20,7 @@ class ConsumableClass {
   
   ConsumableClass<T>& operator=(ConsumableClass<T>  &other);
   ConsumableClass<T>& operator=(ConsumableClass<T> &&other);
-  ConsumableClass<T>& operator=(nullptr_t);
+  ConsumableClass<T>& operator=(nullptr_t) CONSUMES;
   
   template <typename U>
   ConsumableClass<T>& operator=(ConsumableClass<U>  &other);
@@ -174,13 +174,6 @@ void testCallingConventions() {
   *var; // expected-warning {{invocation of method 'operator*' on object 'var' while it is in an unknown state}}
 }
 
-void testMoveAsignmentish() {
-  ConsumableClass<int> var;
-  
-  var = nullptr;
-  *var; // expected-warning {{invocation of method 'operator*' on object 'var' while it is in an unknown state}}
-}
-
 void testConstAndNonConstMemberFunctions() {
   ConsumableClass<int> var(42);
   
@@ -188,7 +181,7 @@ void testConstAndNonConstMemberFunctions() {
   *var;
   
   var.nonconstCall();
-  *var; // expected-warning {{invocation of method 'operator*' on object 'var' while it is in an unknown state}}
+  *var;
 }
 
 void testNoWarnTestFromMacroExpansion() {
index aa5139bed0c49b0c21dcfceefd56fc7e9a30860c..c6646559465f02350d9bda18e65addcd6c3c63f5 100644 (file)
@@ -19,7 +19,7 @@ class ConsumableClass {
   
   ConsumableClass<T>& operator=(ConsumableClass<T>  &other);
   ConsumableClass<T>& operator=(ConsumableClass<T> &&other);
-  ConsumableClass<T>& operator=(nullptr_t);
+  ConsumableClass<T>& operator=(nullptr_t) CONSUMES;
   
   template <typename U>
   ConsumableClass<T>& operator=(ConsumableClass<U>  &other);
@@ -251,6 +251,10 @@ void testMoveAsignmentish() {
   
   *var0;
   *var1; // expected-warning {{invocation of method 'operator*' on object 'var1' while it is in the 'consumed' state}}
+  
+  var1 = ConsumableClass<long>(42);
+  var1 = nullptr;
+  *var1; // expected-warning {{invocation of method 'operator*' on object 'var1' while it is in the 'consumed' state}}
 }
 
 void testConditionalMerge() {