diff options
author | DeLesley Hutchins <delesley@google.com> | 2013-10-18 19:25:18 +0000 |
---|---|---|
committer | DeLesley Hutchins <delesley@google.com> | 2013-10-18 19:25:18 +0000 |
commit | 0bd25897ef26348a5194889699ce549a9049a423 (patch) | |
tree | abc6cff59aebae114747e73f617fc75b839f1f5b /clang/lib/Analysis/Consumed.cpp | |
parent | 68f517938aa1b5853bc2f91d458c2368d9c17bee (diff) | |
download | bcm5719-llvm-0bd25897ef26348a5194889699ce549a9049a423.tar.gz bcm5719-llvm-0bd25897ef26348a5194889699ce549a9049a423.zip |
Consumed analysis: assume that non-const reference parameters are initially
in the "uknown" state. Patch by chris.wailes@gmail.com. Reviewed by delesley.
llvm-svn: 192995
Diffstat (limited to 'clang/lib/Analysis/Consumed.cpp')
-rw-r--r-- | clang/lib/Analysis/Consumed.cpp | 34 |
1 files changed, 21 insertions, 13 deletions
diff --git a/clang/lib/Analysis/Consumed.cpp b/clang/lib/Analysis/Consumed.cpp index ef9617a3ec4..8358b6b4e1c 100644 --- a/clang/lib/Analysis/Consumed.cpp +++ b/clang/lib/Analysis/Consumed.cpp @@ -159,10 +159,20 @@ static bool isKnownState(ConsumedState State) { llvm_unreachable("invalid enum"); } +static bool isRValueRefish(QualType ParamType) { + return ParamType->isRValueReferenceType() || + (ParamType->isLValueReferenceType() && + !cast<LValueReferenceType>(*ParamType).isSpelledAsLValue()); +} + static bool isTestingFunction(const FunctionDecl *FunDecl) { return FunDecl->hasAttr<TestsTypestateAttr>(); } +static bool isValueType(QualType ParamType) { + return !(ParamType->isPointerType() || ParamType->isReferenceType()); +} + static ConsumedState mapConsumableAttrState(const QualType QT) { assert(isConsumableType(QT)); @@ -617,20 +627,15 @@ void ConsumedStmtVisitor::VisitCallExpr(const CallExpr *Call) { // Adjust state on the caller side. - if (ParamType->isRValueReferenceType() || - (ParamType->isLValueReferenceType() && - !cast<LValueReferenceType>(*ParamType).isSpelledAsLValue())) { - + if (isRValueRefish(ParamType)) { StateMap->setState(PInfo.getVar(), consumed::CS_Consumed); } else if (Param->hasAttr<ReturnTypestateAttr>()) { StateMap->setState(PInfo.getVar(), mapReturnTypestateAttrState(Param->getAttr<ReturnTypestateAttr>())); - } else if (!(ParamType.isConstQualified() || - ((ParamType->isReferenceType() || - ParamType->isPointerType()) && - ParamType->getPointeeType().isConstQualified()))) { + } else if (!isValueType(ParamType) && + !ParamType->getPointeeType().isConstQualified()) { StateMap->setState(PInfo.getVar(), consumed::CS_Unknown); } @@ -856,14 +861,17 @@ void ConsumedStmtVisitor::VisitParmVarDecl(const ParmVarDecl *Param) { ConsumedState ParamState = consumed::CS_None; if (Param->hasAttr<ParamTypestateAttr>()) { - ParamState = - mapParamTypestateAttrState(Param->getAttr<ParamTypestateAttr>()); - - } else if (!(ParamType->isPointerType() || ParamType->isReferenceType()) && - isConsumableType(ParamType)) { + const ParamTypestateAttr *PTAttr = Param->getAttr<ParamTypestateAttr>(); + ParamState = mapParamTypestateAttrState(PTAttr); + } else if (isValueType(ParamType) && isConsumableType(ParamType)) { ParamState = mapConsumableAttrState(ParamType); + } else if (isRValueRefish(ParamType) && + isConsumableType(ParamType->getPointeeType())) { + + ParamState = mapConsumableAttrState(ParamType->getPointeeType()); + } else if (ParamType->isReferenceType() && isConsumableType(ParamType->getPointeeType())) { ParamState = consumed::CS_Unknown; |