Centralize the check for a tag definition in a Declarator::PrototypeContext inside GetTypeForDeclarator.

No functionality change.

llvm-svn: 133985
This commit is contained in:
Argyrios Kyrtzidis 2011-06-28 03:01:15 +00:00
parent 8ea7e5838b
commit ef7022f259
3 changed files with 8 additions and 18 deletions

View File

@ -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()) {

View File

@ -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(),

View File

@ -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