From: Zhongxing Xu Date: Fri, 16 Jan 2009 03:34:13 +0000 (+0000) Subject: Extract code dealing with typedef declarators into a separate function. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d5ed8c3d7de82ee1f028806ccac9b921832fb528;p=clang Extract code dealing with typedef declarators into a separate function. No functionality change. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@62303 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/Sema.h b/lib/Sema/Sema.h index aabc9c17cb..9bfa1ffefc 100644 --- a/lib/Sema/Sema.h +++ b/lib/Sema/Sema.h @@ -277,6 +277,9 @@ public: } DeclTy *ActOnDeclarator(Scope *S, Declarator &D, DeclTy *LastInGroup, bool IsFunctionDefinition); + ScopedDecl* ActOnTypedefDeclarator(Scope* S, Declarator& D, DeclContext* DC, + QualType R, ScopedDecl* LastDeclarator, + Decl* PrevDecl, bool& InvalidDecl); ScopedDecl* ActOnVariableDeclarator(Scope* S, Declarator& D, DeclContext* DC, QualType R, ScopedDecl* LastDeclarator, Decl* PrevDecl, bool& InvalidDecl); diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index a7ebd810d8..0927576b51 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -1287,43 +1287,8 @@ Sema::ActOnDeclarator(Scope *S, Declarator &D, DeclTy *lastDecl, assert(!R.isNull() && "GetTypeForDeclarator() returned null type"); if (D.getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_typedef) { - // Typedef declarators cannot be qualified (C++ [dcl.meaning]p1). - if (D.getCXXScopeSpec().isSet()) { - Diag(D.getIdentifierLoc(), diag::err_qualified_typedef_declarator) - << D.getCXXScopeSpec().getRange(); - InvalidDecl = true; - // Pretend we didn't see the scope specifier. - DC = 0; - } - - // Check that there are no default arguments (C++ only). - if (getLangOptions().CPlusPlus) - CheckExtraCXXDefaultArguments(D); - - TypedefDecl *NewTD = ParseTypedefDecl(S, D, R, LastDeclarator); - if (!NewTD) return 0; - - // Handle attributes prior to checking for duplicates in MergeVarDecl - ProcessDeclAttributes(NewTD, D); - // Merge the decl with the existing one if appropriate. If the decl is - // in an outer scope, it isn't the same thing. - if (PrevDecl && isDeclInScope(PrevDecl, DC, S)) { - NewTD = MergeTypeDefDecl(NewTD, PrevDecl); - if (NewTD == 0) return 0; - } - New = NewTD; - if (S->getFnParent() == 0) { - // C99 6.7.7p2: If a typedef name specifies a variably modified type - // then it shall have block scope. - if (NewTD->getUnderlyingType()->isVariablyModifiedType()) { - if (NewTD->getUnderlyingType()->isVariableArrayType()) - Diag(D.getIdentifierLoc(), diag::err_vla_decl_in_file_scope); - else - Diag(D.getIdentifierLoc(), diag::err_vm_decl_in_file_scope); - - InvalidDecl = true; - } - } + New = ActOnTypedefDeclarator(S, D, DC, R, LastDeclarator, PrevDecl, + InvalidDecl); } else if (R.getTypePtr()->isFunctionType()) { New = ActOnFunctionDeclarator(S, D, DC, R, LastDeclarator, PrevDecl, IsFunctionDefinition, InvalidDecl); @@ -1349,6 +1314,50 @@ Sema::ActOnDeclarator(Scope *S, Declarator &D, DeclTy *lastDecl, return New; } +ScopedDecl* +Sema::ActOnTypedefDeclarator(Scope* S, Declarator& D, DeclContext* DC, + QualType R, ScopedDecl* LastDeclarator, + Decl* PrevDecl, bool& InvalidDecl) { + // Typedef declarators cannot be qualified (C++ [dcl.meaning]p1). + if (D.getCXXScopeSpec().isSet()) { + Diag(D.getIdentifierLoc(), diag::err_qualified_typedef_declarator) + << D.getCXXScopeSpec().getRange(); + InvalidDecl = true; + // Pretend we didn't see the scope specifier. + DC = 0; + } + + // Check that there are no default arguments (C++ only). + if (getLangOptions().CPlusPlus) + CheckExtraCXXDefaultArguments(D); + + TypedefDecl *NewTD = ParseTypedefDecl(S, D, R, LastDeclarator); + if (!NewTD) return 0; + + // Handle attributes prior to checking for duplicates in MergeVarDecl + ProcessDeclAttributes(NewTD, D); + // Merge the decl with the existing one if appropriate. If the decl is + // in an outer scope, it isn't the same thing. + if (PrevDecl && isDeclInScope(PrevDecl, DC, S)) { + NewTD = MergeTypeDefDecl(NewTD, PrevDecl); + if (NewTD == 0) return 0; + } + + if (S->getFnParent() == 0) { + // C99 6.7.7p2: If a typedef name specifies a variably modified type + // then it shall have block scope. + if (NewTD->getUnderlyingType()->isVariablyModifiedType()) { + if (NewTD->getUnderlyingType()->isVariableArrayType()) + Diag(D.getIdentifierLoc(), diag::err_vla_decl_in_file_scope); + else + Diag(D.getIdentifierLoc(), diag::err_vm_decl_in_file_scope); + + InvalidDecl = true; + } + } + return NewTD; +} + ScopedDecl* Sema::ActOnVariableDeclarator(Scope* S, Declarator& D, DeclContext* DC, QualType R, ScopedDecl* LastDeclarator,