diff options
| author | Zhongxing Xu <xuzhongxing@gmail.com> | 2009-01-16 03:34:13 +0000 | 
|---|---|---|
| committer | Zhongxing Xu <xuzhongxing@gmail.com> | 2009-01-16 03:34:13 +0000 | 
| commit | ac8ef9ea4c70631d10123eabbf559637b5b63ab8 (patch) | |
| tree | b2df0b59dd569a3f2eebf2caa48b5228621bd3a2 /clang | |
| parent | 6bd18af3a31248f2f96888ecbb60a703da8f2b49 (diff) | |
| download | bcm5719-llvm-ac8ef9ea4c70631d10123eabbf559637b5b63ab8.tar.gz bcm5719-llvm-ac8ef9ea4c70631d10123eabbf559637b5b63ab8.zip  | |
Extract code dealing with typedef declarators into a separate function.
No functionality change.
llvm-svn: 62303
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/Sema/Sema.h | 3 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaDecl.cpp | 83 | 
2 files changed, 49 insertions, 37 deletions
diff --git a/clang/lib/Sema/Sema.h b/clang/lib/Sema/Sema.h index aabc9c17cba..9bfa1ffefc1 100644 --- a/clang/lib/Sema/Sema.h +++ b/clang/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/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index a7ebd810d80..0927576b516 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/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); @@ -1350,6 +1315,50 @@ Sema::ActOnDeclarator(Scope *S, Declarator &D, DeclTy *lastDecl,  }  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,                                Decl* PrevDecl, bool& InvalidDecl) {  | 

