diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2015-01-18 16:23:48 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2015-01-18 16:23:48 +0000 |
commit | 06d4ba388873e6d1cfa9cd715a8935ecc8cd2097 (patch) | |
tree | 3eb853da77d46cc77c4b017525a422f9ddb1385b /test/SemaCXX/devirtualize-vtable-marking.cpp | |
parent | 30d791273d07fac9c0c1641a0731191bca6e8606 (diff) | |
download | src-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.cpp | 47 |
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(); +} +} |