Factor operator new declaration checking out into a separate function.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@91189 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Anders Carlsson 2009-12-12 00:26:23 +00:00
Родитель 46991d6364
Коммит a3ccda5891
3 изменённых файлов: 26 добавлений и 21 удалений

Просмотреть файл

@ -584,7 +584,7 @@ public:
/// getSizeType - Return the unique type for "size_t" (C99 7.17), defined
/// in <stddef.h>. The sizeof operator requires this (C99 6.5.3.4p4).
QualType getSizeType() const;
CanQualType getSizeType() const;
/// getWCharType - In C++, this returns the unique wchar_t type. In C99, this
/// returns a type compatible with the type defined in <stddef.h> as defined

Просмотреть файл

@ -2277,7 +2277,7 @@ QualType ASTContext::getTagDeclType(const TagDecl *Decl) {
/// getSizeType - Return the unique type for "size_t" (C99 7.17), the result
/// of the sizeof operator (C99 6.5.3.4p4). The value is target dependent and
/// needs to agree with the definition in <stddef.h>.
QualType ASTContext::getSizeType() const {
CanQualType ASTContext::getSizeType() const {
return getFromTargetType(Target.getSizeType());
}

Просмотреть файл

@ -4604,6 +4604,28 @@ Sema::CheckReferenceInit(Expr *&Init, QualType DeclType,
}
}
static bool
CheckOperatorNewDeclaration(Sema &SemaRef, FunctionDecl *FnDecl) {
bool ret = false;
if (FunctionDecl::param_iterator Param = FnDecl->param_begin()) {
QualType SizeTy =
SemaRef.Context.getCanonicalType(SemaRef.Context.getSizeType());
QualType T = SemaRef.Context.getCanonicalType((*Param)->getType());
if (!T->isDependentType() && SizeTy != T) {
SemaRef.Diag(FnDecl->getLocation(),
diag::err_operator_new_param_type) << FnDecl->getDeclName()
<< SizeTy;
ret = true;
}
}
QualType ResultTy = SemaRef.Context.getCanonicalType(FnDecl->getResultType());
if (!ResultTy->isDependentType() && ResultTy != SemaRef.Context.VoidPtrTy)
return SemaRef.Diag(FnDecl->getLocation(),
diag::err_operator_new_delete_invalid_result_type)
<< FnDecl->getDeclName() << SemaRef.Context.VoidPtrTy;
return ret;
}
static bool
CheckOperatorDeleteDeclaration(Sema &SemaRef, const FunctionDecl *FnDecl) {
// C++ [basic.stc.dynamic.deallocation]p1:
@ -4678,25 +4700,8 @@ bool Sema::CheckOverloadedOperatorDeclaration(FunctionDecl *FnDecl) {
if (Op == OO_Delete || Op == OO_Array_Delete)
return CheckOperatorDeleteDeclaration(*this, FnDecl);
if (Op == OO_New || Op == OO_Array_New) {
bool ret = false;
if (FunctionDecl::param_iterator Param = FnDecl->param_begin()) {
QualType SizeTy = Context.getCanonicalType(Context.getSizeType());
QualType T = Context.getCanonicalType((*Param)->getType());
if (!T->isDependentType() && SizeTy != T) {
Diag(FnDecl->getLocation(),
diag::err_operator_new_param_type) << FnDecl->getDeclName()
<< SizeTy;
ret = true;
}
}
QualType ResultTy = Context.getCanonicalType(FnDecl->getResultType());
if (!ResultTy->isDependentType() && ResultTy != Context.VoidPtrTy)
return Diag(FnDecl->getLocation(),
diag::err_operator_new_delete_invalid_result_type)
<< FnDecl->getDeclName() << Context.VoidPtrTy;
return ret;
}
if (Op == OO_New || Op == OO_Array_New)
return CheckOperatorNewDeclaration(*this, FnDecl);
// C++ [over.oper]p6:
// An operator function shall either be a non-static member