aboutsummaryrefslogtreecommitdiff
path: root/test/Analysis/inline.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/Analysis/inline.cpp')
-rw-r--r--test/Analysis/inline.cpp27
1 files changed, 27 insertions, 0 deletions
diff --git a/test/Analysis/inline.cpp b/test/Analysis/inline.cpp
index b39b87101a..ddcf5d01c3 100644
--- a/test/Analysis/inline.cpp
+++ b/test/Analysis/inline.cpp
@@ -340,3 +340,30 @@ namespace QualifiedCalls {
clang_analyzer_eval(object->A::getZero() == 0); // expected-warning{{TRUE}}
}
}
+
+
+namespace rdar12409977 {
+ struct Base {
+ int x;
+ };
+
+ struct Parent : public Base {
+ virtual Parent *vGetThis();
+ Parent *getThis() { return vGetThis(); }
+ };
+
+ struct Child : public Parent {
+ virtual Child *vGetThis() { return this; }
+ };
+
+ void test() {
+ Child obj;
+ obj.x = 42;
+
+ // Originally, calling a devirtualized method with a covariant return type
+ // caused a crash because the return value had the wrong type. When we then
+ // go to layer a CXXBaseObjectRegion on it, the base isn't a direct base of
+ // the object region and we get an assertion failure.
+ clang_analyzer_eval(obj.getThis()->x == 42); // expected-warning{{TRUE}}
+ }
+}