зеркало из https://github.com/microsoft/clang-1.git
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:
Родитель
46991d6364
Коммит
a3ccda5891
|
@ -584,7 +584,7 @@ public:
|
||||||
|
|
||||||
/// getSizeType - Return the unique type for "size_t" (C99 7.17), defined
|
/// 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).
|
/// 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
|
/// 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
|
/// 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
|
/// 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
|
/// of the sizeof operator (C99 6.5.3.4p4). The value is target dependent and
|
||||||
/// needs to agree with the definition in <stddef.h>.
|
/// needs to agree with the definition in <stddef.h>.
|
||||||
QualType ASTContext::getSizeType() const {
|
CanQualType ASTContext::getSizeType() const {
|
||||||
return getFromTargetType(Target.getSizeType());
|
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
|
static bool
|
||||||
CheckOperatorDeleteDeclaration(Sema &SemaRef, const FunctionDecl *FnDecl) {
|
CheckOperatorDeleteDeclaration(Sema &SemaRef, const FunctionDecl *FnDecl) {
|
||||||
// C++ [basic.stc.dynamic.deallocation]p1:
|
// C++ [basic.stc.dynamic.deallocation]p1:
|
||||||
|
@ -4678,25 +4700,8 @@ bool Sema::CheckOverloadedOperatorDeclaration(FunctionDecl *FnDecl) {
|
||||||
if (Op == OO_Delete || Op == OO_Array_Delete)
|
if (Op == OO_Delete || Op == OO_Array_Delete)
|
||||||
return CheckOperatorDeleteDeclaration(*this, FnDecl);
|
return CheckOperatorDeleteDeclaration(*this, FnDecl);
|
||||||
|
|
||||||
if (Op == OO_New || Op == OO_Array_New) {
|
if (Op == OO_New || Op == OO_Array_New)
|
||||||
bool ret = false;
|
return CheckOperatorNewDeclaration(*this, FnDecl);
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
// C++ [over.oper]p6:
|
// C++ [over.oper]p6:
|
||||||
// An operator function shall either be a non-static member
|
// An operator function shall either be a non-static member
|
||||||
|
|
Загрузка…
Ссылка в новой задаче