forked from OSchip/llvm-project
Centralize the check for a tag definition in a Declarator::PrototypeContext inside GetTypeForDeclarator.
No functionality change. llvm-svn: 133985
This commit is contained in:
parent
8ea7e5838b
commit
ef7022f259
|
@ -5971,21 +5971,13 @@ Decl *Sema::ActOnParamDeclarator(Scope *S, Declarator &D) {
|
|||
|
||||
DiagnoseFunctionSpecifiers(D);
|
||||
|
||||
TagDecl *OwnedDecl = 0;
|
||||
TypeSourceInfo *TInfo = GetTypeForDeclarator(D, S, &OwnedDecl);
|
||||
TypeSourceInfo *TInfo = GetTypeForDeclarator(D, S);
|
||||
QualType parmDeclType = TInfo->getType();
|
||||
|
||||
if (getLangOptions().CPlusPlus) {
|
||||
// Check that there are no default arguments inside the type of this
|
||||
// parameter.
|
||||
CheckExtraCXXDefaultArguments(D);
|
||||
|
||||
if (OwnedDecl && OwnedDecl->isDefinition()) {
|
||||
// C++ [dcl.fct]p6:
|
||||
// Types shall not be defined in return or parameter types.
|
||||
Diag(OwnedDecl->getLocation(), diag::err_type_defined_in_param_type)
|
||||
<< Context.getTypeDeclType(OwnedDecl);
|
||||
}
|
||||
|
||||
// Parameter declarators cannot be qualified (C++ [dcl.meaning]p1).
|
||||
if (D.getCXXScopeSpec().isSet()) {
|
||||
|
|
|
@ -2607,15 +2607,8 @@ Decl *Sema::ActOnObjCExceptionDecl(Scope *S, Declarator &D) {
|
|||
if (getLangOptions().CPlusPlus)
|
||||
CheckExtraCXXDefaultArguments(D);
|
||||
|
||||
TagDecl *OwnedDecl = 0;
|
||||
TypeSourceInfo *TInfo = GetTypeForDeclarator(D, S, &OwnedDecl);
|
||||
TypeSourceInfo *TInfo = GetTypeForDeclarator(D, S);
|
||||
QualType ExceptionType = TInfo->getType();
|
||||
|
||||
if (getLangOptions().CPlusPlus && OwnedDecl && OwnedDecl->isDefinition()) {
|
||||
// Objective-C++: Types shall not be defined in exception types.
|
||||
Diag(OwnedDecl->getLocation(), diag::err_type_defined_in_param_type)
|
||||
<< Context.getTypeDeclType(OwnedDecl);
|
||||
}
|
||||
|
||||
VarDecl *New = BuildObjCExceptionDecl(TInfo, ExceptionType,
|
||||
D.getSourceRange().getBegin(),
|
||||
|
|
|
@ -2467,7 +2467,6 @@ TypeSourceInfo *Sema::GetTypeForDeclarator(Declarator &D, Scope *S,
|
|||
// or enumeration in a type-specifier-seq.
|
||||
switch (D.getContext()) {
|
||||
case Declarator::FileContext:
|
||||
case Declarator::PrototypeContext:
|
||||
case Declarator::ObjCPrototypeContext:
|
||||
case Declarator::KNRTypeListContext:
|
||||
case Declarator::TypeNameContext:
|
||||
|
@ -2481,6 +2480,12 @@ TypeSourceInfo *Sema::GetTypeForDeclarator(Declarator &D, Scope *S,
|
|||
case Declarator::AliasDeclContext:
|
||||
case Declarator::AliasTemplateContext:
|
||||
break;
|
||||
case Declarator::PrototypeContext:
|
||||
// C++ [dcl.fct]p6:
|
||||
// Types shall not be defined in return or parameter types.
|
||||
Diag(OwnedTagDeclInternal->getLocation(), diag::err_type_defined_in_param_type)
|
||||
<< Context.getTypeDeclType(OwnedTagDeclInternal);
|
||||
break;
|
||||
case Declarator::ConditionContext:
|
||||
// C++ 6.4p2:
|
||||
// The type-specifier-seq shall not contain typedef and shall not declare
|
||||
|
|
Loading…
Reference in New Issue