Original PR: #130537 Originally reverted due to revert of dependent commit. Relanding with no changes. This changes the MemberPointerType representation to use a NestedNameSpecifier instead of a Type to represent the base class. Since the qualifiers are always parsed as nested names, there was an impedance mismatch when converting these back and forth into types, and this led to issues in preserving sugar. The nested names are indeed a better match for these, as the differences which a QualType can represent cannot be expressed syntatically, and they represent the use case more exactly, being either dependent or referring to a CXXRecord, unqualified. This patch also makes the MemberPointerType able to represent sugar for a {up/downcast}cast conversion of the base class, although for now the underlying type is canonical, as preserving the sugar up to that point requires further work. As usual, includes a few drive-by fixes in order to make use of the improvements.
62 lines
1.5 KiB
C++
62 lines
1.5 KiB
C++
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
|
|
|
void test0() {
|
|
char variable = (void)0;
|
|
// expected-error@-1{{cannot initialize a variable}}
|
|
}
|
|
|
|
void test1(int x = (void)0) {}
|
|
// expected-error@-1{{cannot initialize a parameter}}
|
|
// expected-note@-2{{here}}
|
|
|
|
int test2() {
|
|
return (void)0;
|
|
// expected-error@-1{{cannot initialize return object}}
|
|
}
|
|
|
|
struct S4 {
|
|
S4() : x((void)0) {};
|
|
// expected-error@-1{{cannot initialize a member subobject}}
|
|
int x;
|
|
};
|
|
|
|
void test5() {
|
|
int foo[2] = {1, (void)0};
|
|
// expected-error@-1{{cannot initialize an array element}}
|
|
}
|
|
|
|
void test6() {
|
|
new int((void)0);
|
|
// expected-error@-1{{cannot initialize a new value}}
|
|
}
|
|
|
|
typedef short short2 __attribute__ ((__vector_size__ (2)));
|
|
void test10() {
|
|
short2 V = { (void)0 };
|
|
// expected-error@-1{{cannot initialize a vector element}}
|
|
}
|
|
|
|
typedef float float2 __attribute__((ext_vector_type(2)));
|
|
typedef float float4 __attribute__((ext_vector_type(4)));
|
|
|
|
void test14(const float2 in, const float2 out) {
|
|
const float4 V = (float4){ in, out };
|
|
// expected-error@-1{{cannot initialize a compound literal initializer}}
|
|
}
|
|
|
|
namespace template_test {
|
|
class S {
|
|
public:
|
|
void foo(int);
|
|
};
|
|
|
|
template <class P> struct S2 {
|
|
void (P::*a)(const int &);
|
|
};
|
|
|
|
void test_15() {
|
|
S2<S> X = {&S::foo};
|
|
// expected-error-re@-1{{cannot initialize a member subobject of type 'void (S::*)(const int &){{( __attribute__\(\(thiscall\)\))?}}' with an rvalue of type 'void (S::*)(int){{( __attribute__\(\(thiscall\)\))?}}': type mismatch at 1st parameter ('const int &' vs 'int')}}
|
|
}
|
|
}
|