From ef7022f259ccf8b417d23fc6eb6f6c173487782c Mon Sep 17 00:00:00 2001 From: Argyrios Kyrtzidis Date: Tue, 28 Jun 2011 03:01:15 +0000 Subject: [PATCH] Centralize the check for a tag definition in a Declarator::PrototypeContext inside GetTypeForDeclarator. No functionality change. llvm-svn: 133985 --- clang/lib/Sema/SemaDecl.cpp | 10 +--------- clang/lib/Sema/SemaDeclObjC.cpp | 9 +-------- clang/lib/Sema/SemaType.cpp | 7 ++++++- 3 files changed, 8 insertions(+), 18 deletions(-) diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index adfc6f950137..25569be7b289 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -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()) { diff --git a/clang/lib/Sema/SemaDeclObjC.cpp b/clang/lib/Sema/SemaDeclObjC.cpp index 3052b826b653..a3f53ec234a6 100644 --- a/clang/lib/Sema/SemaDeclObjC.cpp +++ b/clang/lib/Sema/SemaDeclObjC.cpp @@ -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(), diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index 489e50dc1c54..a6905302790a 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -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