aboutsummaryrefslogtreecommitdiff
path: root/test/SemaCXX/devirtualize-vtable-marking.cpp
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2015-01-18 16:23:48 +0000
committerDimitry Andric <dim@FreeBSD.org>2015-01-18 16:23:48 +0000
commit06d4ba388873e6d1cfa9cd715a8935ecc8cd2097 (patch)
tree3eb853da77d46cc77c4b017525a422f9ddb1385b /test/SemaCXX/devirtualize-vtable-marking.cpp
parent30d791273d07fac9c0c1641a0731191bca6e8606 (diff)
downloadsrc-06d4ba388873e6d1cfa9cd715a8935ecc8cd2097.tar.gz
src-06d4ba388873e6d1cfa9cd715a8935ecc8cd2097.zip
Vendor import of clang RELEASE_360/rc1 tag r226102 (effectively, 3.6.0 RC1):vendor/clang/clang-release_360-r226102
Notes
Notes: svn path=/vendor/clang/dist/; revision=277325 svn path=/vendor/clang/clang-release_360-r226102/; revision=277326; tag=vendor/clang/clang-release_360-r226102
Diffstat (limited to 'test/SemaCXX/devirtualize-vtable-marking.cpp')
-rw-r--r--test/SemaCXX/devirtualize-vtable-marking.cpp47
1 files changed, 47 insertions, 0 deletions
diff --git a/test/SemaCXX/devirtualize-vtable-marking.cpp b/test/SemaCXX/devirtualize-vtable-marking.cpp
new file mode 100644
index 000000000000..fc3e8ce7704c
--- /dev/null
+++ b/test/SemaCXX/devirtualize-vtable-marking.cpp
@@ -0,0 +1,47 @@
+// RUN: %clang_cc1 -verify -std=c++11 %s
+
+template <typename T> struct OwnPtr {
+ T *p;
+ ~OwnPtr() {
+ // expected-error@+1 {{invalid application of 'sizeof'}}
+ static_assert(sizeof(T) > 0, "incomplete T");
+ delete p;
+ }
+};
+
+namespace use_vtable_for_vcall {
+struct Incomplete; // expected-note {{forward declaration}}
+struct A {
+ virtual ~A() {}
+ virtual void m() {}
+};
+struct B : A { // expected-note {{in instantiation}}
+ B();
+ virtual void m() { }
+ virtual void m2() { static_cast<A *>(this)->m(); }
+ OwnPtr<Incomplete> m_sqlError;
+};
+
+B *f() {
+ return new B();
+}
+}
+
+namespace dont_mark_qualified_vcall {
+struct Incomplete;
+struct A {
+ virtual ~A() {}
+ virtual void m() {}
+};
+struct B : A {
+ B();
+ // Previously we would mark B's vtable referenced to devirtualize this call to
+ // A::m, even though it's not a virtual call.
+ virtual void m() { A::m(); }
+ OwnPtr<Incomplete> m_sqlError;
+};
+
+B *f() {
+ return new B();
+}
+}