summaryrefslogtreecommitdiffstats
path: root/clang/test/Analysis/inline.cpp
diff options
context:
space:
mode:
authorJordan Rose <jordan_rose@apple.com>2013-02-13 03:11:06 +0000
committerJordan Rose <jordan_rose@apple.com>2013-02-13 03:11:06 +0000
commit42b130b20a46d49b3d8bfb56d4bbc9624f0cd8e0 (patch)
tree23a22d88f4f51ec78ac0d7375e60f50dd1bbd3fa /clang/test/Analysis/inline.cpp
parentff0dd946b176e652a762f6fb89f7b96e84bc4426 (diff)
downloadbcm5719-llvm-42b130b20a46d49b3d8bfb56d4bbc9624f0cd8e0.tar.gz
bcm5719-llvm-42b130b20a46d49b3d8bfb56d4bbc9624f0cd8e0.zip
[analyzer] Use Clang's evaluation for global constants and default arguments.
Previously, we were handling only simple integer constants for globals and the smattering of implicitly-valued expressions handled by Environment for default arguments. Now, we can use any integer constant expression that Clang can evaluate, in addition to everything we handled before. PR15094 / <rdar://problem/12830437> llvm-svn: 175026
Diffstat (limited to 'clang/test/Analysis/inline.cpp')
-rw-r--r--clang/test/Analysis/inline.cpp42
1 files changed, 33 insertions, 9 deletions
diff --git a/clang/test/Analysis/inline.cpp b/clang/test/Analysis/inline.cpp
index 873b046eb1a..f0e69ddfc22 100644
--- a/clang/test/Analysis/inline.cpp
+++ b/clang/test/Analysis/inline.cpp
@@ -216,7 +216,7 @@ namespace DefaultArgs {
class Secret {
public:
- static const int value = 42;
+ static const int value = 40 + 2;
int get(int i = value) {
return i;
}
@@ -225,16 +225,40 @@ namespace DefaultArgs {
void testMethod() {
Secret obj;
clang_analyzer_eval(obj.get(1) == 1); // expected-warning{{TRUE}}
+ clang_analyzer_eval(obj.get() == 42); // expected-warning{{TRUE}}
+ clang_analyzer_eval(Secret::value == 42); // expected-warning{{TRUE}}
+ }
- // FIXME: Should be 'TRUE'. See PR13673 or <rdar://problem/11720796>.
- clang_analyzer_eval(obj.get() == 42); // expected-warning{{UNKNOWN}}
+ enum ABC {
+ A = 0,
+ B = 1,
+ C = 2
+ };
- // FIXME: Even if we constrain the variable, we still have a problem.
- // See PR13385 or <rdar://problem/12156507>.
- if (Secret::value != 42)
- return;
- clang_analyzer_eval(Secret::value == 42); // expected-warning{{TRUE}}
- clang_analyzer_eval(obj.get() == 42); // expected-warning{{UNKNOWN}}
+ int enumUser(ABC input = B) {
+ return static_cast<int>(input);
+ }
+
+ void testEnum() {
+ clang_analyzer_eval(enumUser(C) == 2); // expected-warning{{TRUE}}
+ clang_analyzer_eval(enumUser() == 1); // expected-warning{{TRUE}}
+ }
+
+
+ int exprUser(int input = 2 * 4) {
+ return input;
+ }
+
+ int complicatedExprUser(int input = 2 * Secret::value) {
+ return input;
+ }
+
+ void testExprs() {
+ clang_analyzer_eval(exprUser(1) == 1); // expected-warning{{TRUE}}
+ clang_analyzer_eval(exprUser() == 8); // expected-warning{{TRUE}}
+
+ clang_analyzer_eval(complicatedExprUser(1) == 1); // expected-warning{{TRUE}}
+ clang_analyzer_eval(complicatedExprUser() == 84); // expected-warning{{TRUE}}
}
}
OpenPOWER on IntegriCloud