зеркало из https://github.com/microsoft/clang-1.git
Fix a code gen. crash synthesizing a destructor.
Fixes pr5660. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@90283 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
fbcc7bed1a
Коммит
6bc9768408
|
@ -1933,7 +1933,8 @@ public:
|
||||||
QualType Argument);
|
QualType Argument);
|
||||||
|
|
||||||
bool FindDeallocationFunction(SourceLocation StartLoc, CXXRecordDecl *RD,
|
bool FindDeallocationFunction(SourceLocation StartLoc, CXXRecordDecl *RD,
|
||||||
DeclarationName Name, FunctionDecl* &Operator);
|
DeclarationName Name, FunctionDecl* &Operator,
|
||||||
|
bool Diagnose=true);
|
||||||
|
|
||||||
/// ActOnCXXDelete - Parsed a C++ 'delete' expression
|
/// ActOnCXXDelete - Parsed a C++ 'delete' expression
|
||||||
virtual OwningExprResult ActOnCXXDelete(SourceLocation StartLoc,
|
virtual OwningExprResult ActOnCXXDelete(SourceLocation StartLoc,
|
||||||
|
@ -2160,7 +2161,7 @@ public:
|
||||||
void CheckConstructor(CXXConstructorDecl *Constructor);
|
void CheckConstructor(CXXConstructorDecl *Constructor);
|
||||||
QualType CheckDestructorDeclarator(Declarator &D,
|
QualType CheckDestructorDeclarator(Declarator &D,
|
||||||
FunctionDecl::StorageClass& SC);
|
FunctionDecl::StorageClass& SC);
|
||||||
bool CheckDestructor(CXXDestructorDecl *Destructor);
|
bool CheckDestructor(CXXDestructorDecl *Destructor, bool Diagnose=true);
|
||||||
void CheckConversionDeclarator(Declarator &D, QualType &R,
|
void CheckConversionDeclarator(Declarator &D, QualType &R,
|
||||||
FunctionDecl::StorageClass& SC);
|
FunctionDecl::StorageClass& SC);
|
||||||
DeclPtrTy ActOnConversionDeclarator(CXXConversionDecl *Conversion);
|
DeclPtrTy ActOnConversionDeclarator(CXXConversionDecl *Conversion);
|
||||||
|
|
|
@ -2171,6 +2171,7 @@ void Sema::AddImplicitlyDeclaredMembersToClass(CXXRecordDecl *ClassDecl) {
|
||||||
ClassDecl->addDecl(Destructor);
|
ClassDecl->addDecl(Destructor);
|
||||||
|
|
||||||
AddOverriddenMethods(ClassDecl, Destructor);
|
AddOverriddenMethods(ClassDecl, Destructor);
|
||||||
|
CheckDestructor(Destructor, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2369,7 +2370,7 @@ void Sema::CheckConstructor(CXXConstructorDecl *Constructor) {
|
||||||
|
|
||||||
/// CheckDestructor - Checks a fully-formed destructor for well-formedness,
|
/// CheckDestructor - Checks a fully-formed destructor for well-formedness,
|
||||||
/// issuing any diagnostics required. Returns true on error.
|
/// issuing any diagnostics required. Returns true on error.
|
||||||
bool Sema::CheckDestructor(CXXDestructorDecl *Destructor) {
|
bool Sema::CheckDestructor(CXXDestructorDecl *Destructor, bool Diagnose) {
|
||||||
CXXRecordDecl *RD = Destructor->getParent();
|
CXXRecordDecl *RD = Destructor->getParent();
|
||||||
|
|
||||||
if (Destructor->isVirtual()) {
|
if (Destructor->isVirtual()) {
|
||||||
|
@ -2384,7 +2385,7 @@ bool Sema::CheckDestructor(CXXDestructorDecl *Destructor) {
|
||||||
FunctionDecl *OperatorDelete = 0;
|
FunctionDecl *OperatorDelete = 0;
|
||||||
DeclarationName Name =
|
DeclarationName Name =
|
||||||
Context.DeclarationNames.getCXXOperatorName(OO_Delete);
|
Context.DeclarationNames.getCXXOperatorName(OO_Delete);
|
||||||
if (FindDeallocationFunction(Loc, RD, Name, OperatorDelete))
|
if (FindDeallocationFunction(Loc, RD, Name, OperatorDelete, Diagnose))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
Destructor->setOperatorDelete(OperatorDelete);
|
Destructor->setOperatorDelete(OperatorDelete);
|
||||||
|
|
|
@ -776,7 +776,8 @@ void Sema::DeclareGlobalAllocationFunction(DeclarationName Name,
|
||||||
|
|
||||||
bool Sema::FindDeallocationFunction(SourceLocation StartLoc, CXXRecordDecl *RD,
|
bool Sema::FindDeallocationFunction(SourceLocation StartLoc, CXXRecordDecl *RD,
|
||||||
DeclarationName Name,
|
DeclarationName Name,
|
||||||
FunctionDecl* &Operator) {
|
FunctionDecl* &Operator,
|
||||||
|
bool Diagnose) {
|
||||||
LookupResult Found(*this, Name, StartLoc, LookupOrdinaryName);
|
LookupResult Found(*this, Name, StartLoc, LookupOrdinaryName);
|
||||||
// Try to find operator delete/operator delete[] in class scope.
|
// Try to find operator delete/operator delete[] in class scope.
|
||||||
LookupQualifiedName(Found, RD);
|
LookupQualifiedName(Found, RD);
|
||||||
|
@ -796,6 +797,8 @@ bool Sema::FindDeallocationFunction(SourceLocation StartLoc, CXXRecordDecl *RD,
|
||||||
// We did find operator delete/operator delete[] declarations, but
|
// We did find operator delete/operator delete[] declarations, but
|
||||||
// none of them were suitable.
|
// none of them were suitable.
|
||||||
if (!Found.empty()) {
|
if (!Found.empty()) {
|
||||||
|
if (!Diagnose)
|
||||||
|
return true;
|
||||||
Diag(StartLoc, diag::err_no_suitable_delete_member_function_found)
|
Diag(StartLoc, diag::err_no_suitable_delete_member_function_found)
|
||||||
<< Name << RD;
|
<< Name << RD;
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
// RUN: clang-cc %s -emit-llvm -o - | FileCheck %s
|
||||||
|
|
||||||
|
struct box {
|
||||||
|
virtual ~box();
|
||||||
|
};
|
||||||
|
|
||||||
|
struct pile_box : public box {
|
||||||
|
pile_box(box *);
|
||||||
|
};
|
||||||
|
|
||||||
|
pile_box::pile_box(box *pp)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// CHECK: call void @_ZdlPv
|
||||||
|
|
Загрузка…
Ссылка в новой задаче