summaryrefslogtreecommitdiffstats
path: root/clang/test/Analysis/lifetime-extension.cpp
diff options
context:
space:
mode:
authorArtem Dergachev <artem.dergachev@gmail.com>2018-06-04 20:18:37 +0000
committerArtem Dergachev <artem.dergachev@gmail.com>2018-06-04 20:18:37 +0000
commit643102dfce721f81debc983b3dd447998c662892 (patch)
treebd167d20faba1a70b5a2a6f41d3d48a200acf60f /clang/test/Analysis/lifetime-extension.cpp
parent63db25ba0d5eaba5fb18816a970750e23420fd03 (diff)
downloadbcm5719-llvm-643102dfce721f81debc983b3dd447998c662892.tar.gz
bcm5719-llvm-643102dfce721f81debc983b3dd447998c662892.zip
[analyzer] Re-enable constructors when lifetime extension through fields occurs.
Temporary object constructor inlining was disabled in r326240 for code like const int &x = A().x; because automatic destructor for the lifetime-extended object A() was not working correctly in CFG. CFG was fixed in r333941, so inlining can be re-enabled. CFG for lifetime extension through aggregates still needs to be fixed. Differential Revision: https://reviews.llvm.org/D44239 llvm-svn: 333946
Diffstat (limited to 'clang/test/Analysis/lifetime-extension.cpp')
-rw-r--r--clang/test/Analysis/lifetime-extension.cpp24
1 files changed, 18 insertions, 6 deletions
diff --git a/clang/test/Analysis/lifetime-extension.cpp b/clang/test/Analysis/lifetime-extension.cpp
index 9173129ac14..1bad166d2d8 100644
--- a/clang/test/Analysis/lifetime-extension.cpp
+++ b/clang/test/Analysis/lifetime-extension.cpp
@@ -46,10 +46,18 @@ void f() {
const int &y = A().j[1]; // no-crash
const int &z = (A().j[1], A().j[0]); // no-crash
- // 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}}
+ 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
}
} // end namespace pr19539_crash_on_destroying_an_integer
@@ -144,8 +152,12 @@ 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); // expected-warning{{UNKNOWN}}
+ clang_analyzer_eval(after == before);
+#ifdef TEMPORARIES
+ // expected-warning@-2{{TRUE}}
+#else
+ // expected-warning@-4{{UNKNOWN}}
+#endif
}
struct A { // A is an aggregate.
OpenPOWER on IntegriCloud