From: DeLesley Hutchins Date: Thu, 29 Aug 2013 21:17:25 +0000 (+0000) Subject: Consumed analysis: non-const methods no longer transfer an object into an X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d324a0bcda2754c6fe0b5e27ad50e42850d498c4;p=clang Consumed analysis: non-const methods no longer transfer an object into an 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 --- diff --git a/lib/Analysis/Consumed.cpp b/lib/Analysis/Consumed.cpp index 745840d7a1..e5231e07c2 100644 --- a/lib/Analysis/Consumed.cpp +++ b/lib/Analysis/Consumed.cpp @@ -530,8 +530,6 @@ void ConsumedStmtVisitor::VisitCXXMemberCallExpr( handleTestingFunctionCall(Call, PInfo.getVar()); else if (MethodDecl->hasAttr()) 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()) { + else if (FunDecl->hasAttr()) StateMap->setState(PInfo.getVar(), consumed::CS_Consumed); - - } else if (const CXXMethodDecl *MethodDecl = - dyn_cast_or_null(FunDecl)) { - - if (!MethodDecl->isConst()) - StateMap->setState(PInfo.getVar(), consumed::CS_Unknown); - } } } } diff --git a/test/SemaCXX/warn-consumed-analysis-strict.cpp b/test/SemaCXX/warn-consumed-analysis-strict.cpp index 474f35cf32..c3b254d781 100644 --- a/test/SemaCXX/warn-consumed-analysis-strict.cpp +++ b/test/SemaCXX/warn-consumed-analysis-strict.cpp @@ -20,7 +20,7 @@ class ConsumableClass { ConsumableClass& operator=(ConsumableClass &other); ConsumableClass& operator=(ConsumableClass &&other); - ConsumableClass& operator=(nullptr_t); + ConsumableClass& operator=(nullptr_t) CONSUMES; template ConsumableClass& operator=(ConsumableClass &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 var; - - var = nullptr; - *var; // expected-warning {{invocation of method 'operator*' on object 'var' while it is in an unknown state}} -} - void testConstAndNonConstMemberFunctions() { ConsumableClass 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() { diff --git a/test/SemaCXX/warn-consumed-analysis.cpp b/test/SemaCXX/warn-consumed-analysis.cpp index aa5139bed0..c664655946 100644 --- a/test/SemaCXX/warn-consumed-analysis.cpp +++ b/test/SemaCXX/warn-consumed-analysis.cpp @@ -19,7 +19,7 @@ class ConsumableClass { ConsumableClass& operator=(ConsumableClass &other); ConsumableClass& operator=(ConsumableClass &&other); - ConsumableClass& operator=(nullptr_t); + ConsumableClass& operator=(nullptr_t) CONSUMES; template ConsumableClass& operator=(ConsumableClass &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(42); + var1 = nullptr; + *var1; // expected-warning {{invocation of method 'operator*' on object 'var1' while it is in the 'consumed' state}} } void testConditionalMerge() {