diff options
| author | Douglas Gregor <dgregor@apple.com> | 2010-05-11 20:24:17 +0000 |
|---|---|---|
| committer | Douglas Gregor <dgregor@apple.com> | 2010-05-11 20:24:17 +0000 |
| commit | 0c4aad15c2493bdf7b1ecd71755382a1276fd35a (patch) | |
| tree | 21496be6387e5ebf76c11fa219d5880c6384195e /clang/test | |
| parent | 6c5e4355bbda4ef15dc753c140a8a04e425b806c (diff) | |
| download | bcm5719-llvm-0c4aad15c2493bdf7b1ecd71755382a1276fd35a.tar.gz bcm5719-llvm-0c4aad15c2493bdf7b1ecd71755382a1276fd35a.zip | |
Do not mark the virtual members of an implicitly-instantiated class as
referenced unless we see one of them defined (or the key function
defined, if it as one) or if we need the vtable for something. Fixes
PR7114.
llvm-svn: 103497
Diffstat (limited to 'clang/test')
| -rw-r--r-- | clang/test/CXX/class.access/p4.cpp | 20 | ||||
| -rw-r--r-- | clang/test/SemaCXX/default-assignment-operator.cpp | 13 | ||||
| -rw-r--r-- | clang/test/SemaTemplate/virtual-member-functions.cpp | 23 |
3 files changed, 43 insertions, 13 deletions
diff --git a/clang/test/CXX/class.access/p4.cpp b/clang/test/CXX/class.access/p4.cpp index 1cd89661367..e8afbe7a392 100644 --- a/clang/test/CXX/class.access/p4.cpp +++ b/clang/test/CXX/class.access/p4.cpp @@ -97,7 +97,7 @@ namespace test2 { A A::foo; // okay class B : A { }; // expected-error {{base class 'test2::A' has private constructor}} - B b; + B b; // expected-note{{implicit default constructor}} class C : virtual A { public: @@ -105,7 +105,7 @@ namespace test2 { }; class D : C { }; // expected-error {{inherited virtual base class 'test2::A' has private constructor}} - D d; + D d; // expected-note{{implicit default constructor}} } // Implicit destructor calls. @@ -143,13 +143,15 @@ namespace test3 { }; class Derived3 : // expected-error 2 {{inherited virtual base class 'Base<2>' has private destructor}} \ - // expected-error 2 {{inherited virtual base class 'Base<3>' has private destructor}} + // expected-error 2 {{inherited virtual base class 'Base<3>' has private destructor}} \ + // expected-note 2{{implicit default constructor}} Base<0>, // expected-error 2 {{base class 'Base<0>' has private destructor}} virtual Base<1>, // expected-error 2 {{base class 'Base<1>' has private destructor}} Base2, // expected-error 2 {{base class 'test3::Base2' has private destructor}} virtual Base3 - {}; - Derived3 d3; + {}; + Derived3 d3; // expected-note {{implicit default constructor}}\ + // expected-note{{implicit default destructor}}} } // Conversion functions. @@ -205,13 +207,13 @@ namespace test5 { class Test1 { A a; }; // expected-error {{private member}} void test1() { Test1 a; - a = Test1(); + a = Test1(); // expected-note{{implicit default copy}} } class Test2 : A {}; // expected-error {{private member}} void test2() { Test2 a; - a = Test2(); + a = Test2(); // expected-note{{implicit default copy}} } } @@ -224,12 +226,12 @@ namespace test6 { class Test1 { A a; }; // expected-error {{field of type 'test6::A' has private copy constructor}} void test1(const Test1 &t) { - Test1 a = t; + Test1 a = t; // expected-note{{implicit default copy}} } class Test2 : A {}; // expected-error {{base class 'test6::A' has private copy constructor}} void test2(const Test2 &t) { - Test2 a = t; + Test2 a = t; // expected-note{{implicit default copy}} } } diff --git a/clang/test/SemaCXX/default-assignment-operator.cpp b/clang/test/SemaCXX/default-assignment-operator.cpp index 4b5531e0c87..0be5df39b15 100644 --- a/clang/test/SemaCXX/default-assignment-operator.cpp +++ b/clang/test/SemaCXX/default-assignment-operator.cpp @@ -7,7 +7,8 @@ class Base { // expected-error {{cannot define the implicit default assignment o }; class X : Base { // // expected-error {{cannot define the implicit default assignment operator for 'X', because non-static const member 'cint' can't use default assignment operator}} \ -// expected-note{{assignment operator for 'Base' first required here}} +// expected-note{{assignment operator for 'Base' first required here}} \ + // expected-note{{implicit default copy assignment operator}} public: X(); const int cint; // expected-note {{declared here}} @@ -28,7 +29,8 @@ Z z2; // Test1 void f(X x, const X cx) { - x = cx; // expected-note{{assignment operator for 'X' first required here}} + x = cx; // expected-note{{assignment operator for 'X' first required here}} \ + // expected-note{{implicit default copy assignment operator}} x = cx; z1 = z2; } @@ -84,7 +86,9 @@ public: E1 e1, e2; void j() { - e1 = e2; // expected-note{{assignment operator for 'E1' first required here}} + // FIXME: duplicated! + e1 = e2; // expected-note{{assignment operator for 'E1' first required here}} \ + // expected-note{{implicit default copy assignment operator}} } namespace ProtectedCheck { @@ -101,7 +105,8 @@ namespace ProtectedCheck { X x; }; - void f(Z z) { z = z; } // + void f(Z z) { z = z; } // expected-note{{implicit default copy assignment operator}} + } namespace MultiplePaths { diff --git a/clang/test/SemaTemplate/virtual-member-functions.cpp b/clang/test/SemaTemplate/virtual-member-functions.cpp index 59df3c22aa1..9ef1849bce6 100644 --- a/clang/test/SemaTemplate/virtual-member-functions.cpp +++ b/clang/test/SemaTemplate/virtual-member-functions.cpp @@ -53,3 +53,26 @@ T *HasOutOfLineKey<T>::f(float *fp) { } HasOutOfLineKey<int> out_of_line; + +namespace std { + class type_info; +} + +namespace PR7114 { + class A { virtual ~A(); }; // expected-note{{declared private here}} + + template<typename T> + class B { + public: + class Inner : public A { }; // expected-error{{base class 'PR7114::A' has private destructor}} + static Inner i; + static const unsigned value = sizeof(i) == 4; + }; + + int f() { return B<int>::value; } + + void test_typeid(B<float>::Inner bfi) { + (void)typeid(bfi); // expected-note{{implicit default destructor}} + } +} + |

