summaryrefslogtreecommitdiffstats
path: root/clang/test/Analysis/operator-calls.cpp
diff options
context:
space:
mode:
authorJordan Rose <jordan_rose@apple.com>2013-04-18 16:33:40 +0000
committerJordan Rose <jordan_rose@apple.com>2013-04-18 16:33:40 +0000
commitcdb44bdb3dfe487eff00198ddf462ffcc90df132 (patch)
tree136e205146fd8c046d9a0f406688a657ecc84588 /clang/test/Analysis/operator-calls.cpp
parentdb003998fb30f0878289c18423834cbf7310b48f (diff)
downloadbcm5719-llvm-cdb44bdb3dfe487eff00198ddf462ffcc90df132.tar.gz
bcm5719-llvm-cdb44bdb3dfe487eff00198ddf462ffcc90df132.zip
[analyzer] Don't crash if we cache out after making a temporary region.
A C++ overloaded operator may be implemented as an instance method, and that instance method may be called on an rvalue object, which has no associated region. The analyzer handles this by creating a temporary region just for the evaluation of this call; however, it is possible that /by creating the region/, the analyzer ends up in a previously-explored state. In this case we don't need to continue along this path. This doesn't actually show any behavioral change now, but it starts being used with the next commit and prevents an assertion failure there. llvm-svn: 179766
Diffstat (limited to 'clang/test/Analysis/operator-calls.cpp')
-rw-r--r--clang/test/Analysis/operator-calls.cpp36
1 files changed, 36 insertions, 0 deletions
diff --git a/clang/test/Analysis/operator-calls.cpp b/clang/test/Analysis/operator-calls.cpp
index 4f686e55fdf..7461d75f673 100644
--- a/clang/test/Analysis/operator-calls.cpp
+++ b/clang/test/Analysis/operator-calls.cpp
@@ -49,3 +49,39 @@ namespace UserDefinedConversions {
clang_analyzer_eval(obj); // expected-warning{{TRUE}}
}
}
+
+
+namespace RValues {
+ struct SmallOpaque {
+ float x;
+ int operator +() const {
+ return (int)x;
+ }
+ };
+
+ struct LargeOpaque {
+ float x[4];
+ int operator +() const {
+ return (int)x[0];
+ }
+ };
+
+ SmallOpaque getSmallOpaque() {
+ SmallOpaque obj;
+ obj.x = 1.0;
+ return obj;
+ }
+
+ LargeOpaque getLargeOpaque() {
+ LargeOpaque obj = LargeOpaque();
+ obj.x[0] = 1.0;
+ return obj;
+ }
+
+ void test(int coin) {
+ // Force a cache-out when we try to conjure a temporary region for the operator call.
+ // ...then, don't crash.
+ clang_analyzer_eval(+(coin ? getSmallOpaque() : getSmallOpaque())); // expected-warning{{UNKNOWN}}
+ clang_analyzer_eval(+(coin ? getLargeOpaque() : getLargeOpaque())); // expected-warning{{UNKNOWN}}
+ }
+}
OpenPOWER on IntegriCloud