summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2012-11-12 23:03:24 +0000
committerTed Kremenek <kremenek@apple.com>2012-11-12 23:03:24 +0000
commit1e0e6a34c3c4deb2df69297af8bcfd90ca1e59c7 (patch)
tree3ad3c700d52665e5b4678d866b8eb8517635dd1a
parent0f8d56a41140b434fe9f666f15990daefc8e7e9c (diff)
downloadclang-1e0e6a34c3c4deb2df69297af8bcfd90ca1e59c7.tar.gz
clang-1e0e6a34c3c4deb2df69297af8bcfd90ca1e59c7.tar.bz2
clang-1e0e6a34c3c4deb2df69297af8bcfd90ca1e59c7.tar.xz
Merge in analyzer fix r167762, which was a recent regression.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/branches/release_32@167776 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp2
-rw-r--r--test/Analysis/retain-release-inline.m16
2 files changed, 18 insertions, 0 deletions
diff --git a/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp b/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp
index 3c1c412af5..5b88a45495 100644
--- a/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp
+++ b/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp
@@ -137,6 +137,8 @@ static SVal adjustReturnValue(SVal V, QualType ExpectedTy, QualType ActualTy,
return V;
// If the types already match, don't do any unnecessary work.
+ ExpectedTy = ExpectedTy.getCanonicalType();
+ ActualTy = ActualTy.getCanonicalType();
if (ExpectedTy == ActualTy)
return V;
diff --git a/test/Analysis/retain-release-inline.m b/test/Analysis/retain-release-inline.m
index a06b3531fe..6ff9e9a552 100644
--- a/test/Analysis/retain-release-inline.m
+++ b/test/Analysis/retain-release-inline.m
@@ -343,5 +343,21 @@ void test_test_return_inline_2(char *bytes) {
CFRelease(str);
}
+extern CFStringRef getString(void);
+CFStringRef testCovariantReturnType(void) __attribute__((cf_returns_retained));
+void usetestCovariantReturnType() {
+ CFStringRef S = ((void*)0);
+ S = testCovariantReturnType();
+ if (S)
+ CFRelease(S);
+}
+CFStringRef testCovariantReturnType() {
+ CFStringRef Str = ((void*)0);
+ Str = getString();
+ if (Str) {
+ CFRetain(Str);
+ }
+ return Str;
+}