mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-26 23:09:03 -04:00

Various pieces of code, like base initialization in Sema and RTTI IRGen, don't properly ignore qualifiers on base classes. Instead of auditing the whole codebase, just strip them off in the getter. (The type as written is still available in the TypeSourceInfo for code that cares.) Fixes PR16596. llvm-svn: 186125
111 lines
2.7 KiB
C++
111 lines
2.7 KiB
C++
// RUN: %clang_cc1 -fsyntax-only -std=c++11 -verify %s
|
|
|
|
class S {
|
|
public:
|
|
S ();
|
|
};
|
|
|
|
struct D : S {
|
|
D() :
|
|
b1(0), // expected-note {{previous initialization is here}}
|
|
b2(1),
|
|
b1(0), // expected-error {{multiple initializations given for non-static member 'b1'}}
|
|
S(), // expected-note {{previous initialization is here}}
|
|
S() // expected-error {{multiple initializations given for base 'S'}}
|
|
{}
|
|
int b1;
|
|
int b2;
|
|
};
|
|
|
|
struct A {
|
|
struct {
|
|
int a;
|
|
int b;
|
|
};
|
|
A();
|
|
};
|
|
|
|
A::A() : a(10), b(20) { }
|
|
|
|
namespace Test1 {
|
|
template<typename T> struct A {};
|
|
template<typename T> struct B : A<T> {
|
|
|
|
B() : A<T>(), // expected-note {{previous initialization is here}}
|
|
A<T>() { } // expected-error {{multiple initializations given for base 'A<T>'}}
|
|
};
|
|
}
|
|
|
|
namespace Test2 {
|
|
template<typename T> struct A : T {
|
|
A() : T(), // expected-note {{previous initialization is here}}
|
|
T() { } // expected-error {{multiple initializations given for base 'T'}}
|
|
};
|
|
}
|
|
|
|
namespace Test3 {
|
|
template<typename T> struct A {
|
|
T t;
|
|
|
|
A() : t(1), // expected-note {{previous initialization is here}}
|
|
t(2) { } // expected-error {{multiple initializations given for non-static member 't'}}
|
|
};
|
|
}
|
|
|
|
namespace test4 {
|
|
class A {
|
|
union {
|
|
struct {
|
|
int a;
|
|
int b;
|
|
};
|
|
|
|
int c;
|
|
|
|
union {
|
|
int d;
|
|
int e;
|
|
};
|
|
};
|
|
|
|
A(char _) : a(0), b(0) {}
|
|
A(short _) : a(0), c(0) {} // expected-error {{initializing multiple members of union}} expected-note {{previous initialization is here}}
|
|
A(int _) : d(0), e(0) {} // expected-error {{initializing multiple members of union}} expected-note {{previous initialization is here}}
|
|
A(long _) : a(0), d(0) {} // expected-error {{initializing multiple members of union}} expected-note {{previous initialization is here}}
|
|
};
|
|
}
|
|
|
|
namespace test5 {
|
|
struct Base {
|
|
Base(int);
|
|
};
|
|
struct A : Base {
|
|
A() : decltype(Base(1))(3) {
|
|
}
|
|
A(int) : Base(3), // expected-note {{previous initialization is here}}
|
|
decltype(Base(1))(2), // expected-error {{multiple initializations given for base 'decltype(test5::Base(1))' (aka 'test5::Base')}}
|
|
decltype(int())() { // expected-error {{constructor initializer 'decltype(int())' (aka 'int') does not name a class}}
|
|
}
|
|
A(float) : decltype(A())(3) {
|
|
}
|
|
};
|
|
}
|
|
|
|
namespace rdar13185264 {
|
|
class X {
|
|
X() : a(), // expected-note{{previous initialization is here}}
|
|
a() { } // expected-error{{multiple initializations given for non-static member 'a'}}
|
|
union { void *a; };
|
|
};
|
|
}
|
|
|
|
namespace PR16596 {
|
|
class A { public: virtual ~A(); };
|
|
typedef const A Foo;
|
|
void Apply(Foo processor);
|
|
struct Bar : public Foo {};
|
|
void Fetch() {
|
|
Apply(Bar());
|
|
}
|
|
}
|