зеркало из https://github.com/microsoft/clang-1.git
Make sure we don't name a constructor or destructor with a qualified
type. It leads to very weird errors. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@62124 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
35c33293ef
Коммит
e63ef48b76
|
@ -286,9 +286,11 @@ DeclarationNameTable::getCXXSpecialName(DeclarationName::NameKind Kind,
|
|||
switch (Kind) {
|
||||
case DeclarationName::CXXConstructorName:
|
||||
EKind = DeclarationNameExtra::CXXConstructor;
|
||||
assert(Ty.getCVRQualifiers() == 0 && "Constructor type must be unqualified");
|
||||
break;
|
||||
case DeclarationName::CXXDestructorName:
|
||||
EKind = DeclarationNameExtra::CXXDestructor;
|
||||
assert(Ty.getCVRQualifiers() == 0 && "Destructor type must be unqualified");
|
||||
break;
|
||||
case DeclarationName::CXXConversionFunctionName:
|
||||
EKind = DeclarationNameExtra::CXXConversionFunction;
|
||||
|
|
|
@ -1115,7 +1115,7 @@ bool Sema::IsUserDefinedConversion(Expr *From, QualType ToType,
|
|||
CXXRecordDecl *ToRecordDecl = ToRecordType->getDecl();
|
||||
DeclarationName ConstructorName
|
||||
= Context.DeclarationNames.getCXXConstructorName(
|
||||
Context.getCanonicalType(ToType));
|
||||
Context.getCanonicalType(ToType).getUnqualifiedType());
|
||||
DeclContext::lookup_iterator Con, ConEnd;
|
||||
for (llvm::tie(Con, ConEnd) = ToRecordDecl->lookup(ConstructorName);
|
||||
Con != ConEnd; ++Con) {
|
||||
|
|
|
@ -172,3 +172,14 @@ void test_arrow(Arrow1 a1, Arrow2 a2, const Arrow2 a3) {
|
|||
int &i2 = a2->m;
|
||||
a3->m; // expected-error{{no viable overloaded 'operator->'; candidate is}}
|
||||
}
|
||||
|
||||
struct CopyConBase {
|
||||
};
|
||||
|
||||
struct CopyCon : public CopyConBase {
|
||||
CopyCon(const CopyConBase &Base);
|
||||
|
||||
CopyCon(const CopyConBase *Base) {
|
||||
*this = *Base;
|
||||
}
|
||||
};
|
||||
|
|
Загрузка…
Ссылка в новой задаче