diff options
author | DeLesley Hutchins <delesley@google.com> | 2013-10-17 22:53:04 +0000 |
---|---|---|
committer | DeLesley Hutchins <delesley@google.com> | 2013-10-17 22:53:04 +0000 |
commit | 36ea1dd4fc5e193d0eb7f6bf69f15d3779b6da24 (patch) | |
tree | 1995fb9ee35a51717ef613dfd7b3280928716ebc /clang/lib/Sema/SemaDeclAttr.cpp | |
parent | c1d547129185cabebc2d0857eea6a03d5bdf8b81 (diff) | |
download | bcm5719-llvm-36ea1dd4fc5e193d0eb7f6bf69f15d3779b6da24.tar.gz bcm5719-llvm-36ea1dd4fc5e193d0eb7f6bf69f15d3779b6da24.zip |
Consumed Analysis: Allow parameters that are passed by non-const reference
to be treated as return values, and marked with the "returned_typestate"
attribute. Patch by chris.wailes@gmail.com; reviewed by delesley@google.com.
llvm-svn: 192932
Diffstat (limited to 'clang/lib/Sema/SemaDeclAttr.cpp')
-rw-r--r-- | clang/lib/Sema/SemaDeclAttr.cpp | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp index c08767574ce..c3e6bc4cc34 100644 --- a/clang/lib/Sema/SemaDeclAttr.cpp +++ b/clang/lib/Sema/SemaDeclAttr.cpp @@ -1068,6 +1068,14 @@ static void handleCallableWhenAttr(Sema &S, Decl *D, static void handleReturnTypestateAttr(Sema &S, Decl *D, const AttributeList &Attr) { + if (!checkAttributeNumArgs(S, Attr, 1)) return; + + if (!(isa<FunctionDecl>(D) || isa<ParmVarDecl>(D))) { + S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type) << + Attr.getName() << ExpectedFunctionMethodOrParameter; + return; + } + ReturnTypestateAttr::ConsumedState ReturnState; if (Attr.isArgIdent(0)) { @@ -1084,18 +1092,16 @@ static void handleReturnTypestateAttr(Sema &S, Decl *D, return; } - if (!isa<FunctionDecl>(D)) { - S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type) << - Attr.getName() << ExpectedFunction; - return; - } - // FIXME: This check is currently being done in the analysis. It can be // enabled here only after the parser propagates attributes at // template specialization definition, not declaration. //QualType ReturnType; // - //if (const CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(D)) { + //if (const ParmVarDecl *Param = dyn_cast<ParmVarDecl>(D)) { + // ReturnType = Param->getType(); + // + //} else if (const CXXConstructorDecl *Constructor = + // dyn_cast<CXXConstructorDecl>(D)) { // ReturnType = Constructor->getThisType(S.getASTContext())->getPointeeType(); // //} else { |