summaryrefslogtreecommitdiffstats
path: root/clang/lib/Analysis/Consumed.cpp
diff options
context:
space:
mode:
authorDeLesley Hutchins <delesley@google.com>2013-10-18 19:25:18 +0000
committerDeLesley Hutchins <delesley@google.com>2013-10-18 19:25:18 +0000
commit0bd25897ef26348a5194889699ce549a9049a423 (patch)
treeabc6cff59aebae114747e73f617fc75b839f1f5b /clang/lib/Analysis/Consumed.cpp
parent68f517938aa1b5853bc2f91d458c2368d9c17bee (diff)
downloadbcm5719-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.cpp34
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;
OpenPOWER on IntegriCloud