summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2010-11-01 23:16:05 +0000
committerDouglas Gregor <dgregor@apple.com>2010-11-01 23:16:05 +0000
commit4b8eca88b0b48f4777ff4591470797f17fb9b036 (patch)
tree375d59e50652ee2bc89296ff35cc9f11bda9ebc3 /clang
parentf7e176a3ec98b6ba1ec45880ebd70a17c1f77290 (diff)
downloadbcm5719-llvm-4b8eca88b0b48f4777ff4591470797f17fb9b036.tar.gz
bcm5719-llvm-4b8eca88b0b48f4777ff4591470797f17fb9b036.zip
Teach the CStringChecker and PthreadLockChecker about non-identifier
declaration names, from Jim Goodnow II! llvm-svn: 117970
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/Checker/CStringChecker.cpp5
-rw-r--r--clang/lib/Checker/PthreadLockChecker.cpp5
-rw-r--r--clang/test/Analysis/operator-calls.cpp16
3 files changed, 24 insertions, 2 deletions
diff --git a/clang/lib/Checker/CStringChecker.cpp b/clang/lib/Checker/CStringChecker.cpp
index d61fdd437d6..966d04f6e13 100644
--- a/clang/lib/Checker/CStringChecker.cpp
+++ b/clang/lib/Checker/CStringChecker.cpp
@@ -905,7 +905,10 @@ bool CStringChecker::EvalCallExpr(CheckerContext &C, const CallExpr *CE) {
return false;
// Get the name of the callee. If it's a builtin, strip off the prefix.
- llvm::StringRef Name = FD->getName();
+ IdentifierInfo *II = FD->getIdentifier();
+ if (!II) // if no identifier, not a simple C function
+ return false;
+ llvm::StringRef Name = II->getName();
if (Name.startswith("__builtin_"))
Name = Name.substr(10);
diff --git a/clang/lib/Checker/PthreadLockChecker.cpp b/clang/lib/Checker/PthreadLockChecker.cpp
index 74e266c3edf..c4bd3641382 100644
--- a/clang/lib/Checker/PthreadLockChecker.cpp
+++ b/clang/lib/Checker/PthreadLockChecker.cpp
@@ -65,7 +65,10 @@ void PthreadLockChecker::PostVisitCallExpr(CheckerContext &C,
if (!R)
return;
- llvm::StringRef FName = R->getDecl()->getName();
+ IdentifierInfo *II = R->getDecl()->getIdentifier();
+ if (!II) // if no identifier, not a simple C function
+ return;
+ llvm::StringRef FName = II->getName();
if (FName == "pthread_mutex_lock") {
if (CE->getNumArgs() != 1)
diff --git a/clang/test/Analysis/operator-calls.cpp b/clang/test/Analysis/operator-calls.cpp
new file mode 100644
index 00000000000..1b8b629f359
--- /dev/null
+++ b/clang/test/Analysis/operator-calls.cpp
@@ -0,0 +1,16 @@
+// RUN: %clang_cc1 -analyze -analyzer-experimental-internal-checks -analyzer-check-objc-mem -analyzer-experimental-checks -verify %s
+struct X0 { };
+bool operator==(const X0&, const X0&);
+
+// PR7287
+struct test { int a[2]; };
+
+void t2() {
+ test p = {{1,2}};
+ test q;
+ q = p;
+}
+
+bool PR7287(X0 a, X0 b) {
+ return a == b;
+}
OpenPOWER on IntegriCloud