summaryrefslogtreecommitdiffstats
path: root/clang/test
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2010-05-11 20:24:17 +0000
committerDouglas Gregor <dgregor@apple.com>2010-05-11 20:24:17 +0000
commit0c4aad15c2493bdf7b1ecd71755382a1276fd35a (patch)
tree21496be6387e5ebf76c11fa219d5880c6384195e /clang/test
parent6c5e4355bbda4ef15dc753c140a8a04e425b806c (diff)
downloadbcm5719-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.cpp20
-rw-r--r--clang/test/SemaCXX/default-assignment-operator.cpp13
-rw-r--r--clang/test/SemaTemplate/virtual-member-functions.cpp23
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}}
+ }
+}
+
OpenPOWER on IntegriCloud