summaryrefslogtreecommitdiffstats
path: root/clang/test/Analysis/lifetime-extension.cpp
diff options
context:
space:
mode:
authorArtem Dergachev <artem.dergachev@gmail.com>2018-02-27 20:14:06 +0000
committerArtem Dergachev <artem.dergachev@gmail.com>2018-02-27 20:14:06 +0000
commit8cd7961a0af7914345ba9ab8583e7fe7b7367b47 (patch)
treec72a8a41b37b752231aa5d633cf2fcd492f090ca /clang/test/Analysis/lifetime-extension.cpp
parentb7f53df0c2b5f33e562de876f51a18eace0b4997 (diff)
downloadbcm5719-llvm-8cd7961a0af7914345ba9ab8583e7fe7b7367b47.tar.gz
bcm5719-llvm-8cd7961a0af7914345ba9ab8583e7fe7b7367b47.zip
[analyzer] Disable constructor inlining when lifetime extending through a field.
Automatic destructors are missing in the CFG in situations like const int &x = C().x; For now it's better to disable construction inlining, because inlining constructors while doing nothing on destructors is very bad. Differential Revision: https://reviews.llvm.org/D43689 llvm-svn: 326240
Diffstat (limited to 'clang/test/Analysis/lifetime-extension.cpp')
-rw-r--r--clang/test/Analysis/lifetime-extension.cpp23
1 files changed, 5 insertions, 18 deletions
diff --git a/clang/test/Analysis/lifetime-extension.cpp b/clang/test/Analysis/lifetime-extension.cpp
index 93605fc44d1..9b64280529c 100644
--- a/clang/test/Analysis/lifetime-extension.cpp
+++ b/clang/test/Analysis/lifetime-extension.cpp
@@ -39,18 +39,10 @@ void f() {
const int &y = A().j[1]; // no-crash
const int &z = (A().j[1], A().j[0]); // no-crash
- clang_analyzer_eval(x == 1);
- clang_analyzer_eval(y == 3);
- clang_analyzer_eval(z == 2);
-#ifdef TEMPORARIES
- // expected-warning@-4{{TRUE}}
- // expected-warning@-4{{TRUE}}
- // expected-warning@-4{{TRUE}}
-#else
- // expected-warning@-8{{UNKNOWN}}
- // expected-warning@-8{{UNKNOWN}}
- // expected-warning@-8{{UNKNOWN}}
-#endif
+ // FIXME: All of these should be TRUE, but constructors aren't inlined.
+ clang_analyzer_eval(x == 1); // expected-warning{{UNKNOWN}}
+ clang_analyzer_eval(y == 3); // expected-warning{{UNKNOWN}}
+ clang_analyzer_eval(z == 2); // expected-warning{{UNKNOWN}}
}
} // end namespace pr19539_crash_on_destroying_an_integer
@@ -144,12 +136,7 @@ void f5() {
const bool &x = C(true, &after, &before).x; // no-crash
}
// FIXME: Should be TRUE. Should not warn about garbage value.
- clang_analyzer_eval(after == before);
-#ifdef TEMPORARIES
- // expected-warning@-2{{The left operand of '==' is a garbage value}}
-#else
- // expected-warning@-4{{UNKNOWN}}
-#endif
+ clang_analyzer_eval(after == before); // expected-warning{{UNKNOWN}}
}
} // end namespace maintain_original_object_address_on_lifetime_extension
OpenPOWER on IntegriCloud