]> granicus.if.org Git - clang/commitdiff
Add more support for Apple's "private extern" extension...
authorSteve Naroff <snaroff@apple.com>
Fri, 25 Jan 2008 22:14:40 +0000 (22:14 +0000)
committerSteve Naroff <snaroff@apple.com>
Fri, 25 Jan 2008 22:14:40 +0000 (22:14 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46371 91177308-0d34-0410-b5e6-96231b3b80d8

CodeGen/CodeGenModule.cpp
Parse/ParseDecl.cpp
Sema/SemaDecl.cpp
include/clang/AST/Decl.h
include/clang/Parse/DeclSpec.h

index e841ee54926774406c191ea634bf91a5a91332a9..407812f21d0d341fc1ebeb1a3f925950e2d0a65e 100644 (file)
@@ -572,6 +572,7 @@ void CodeGenModule::EmitGlobalVar(const FileVarDecl *D) {
     assert(0 && "Can't have auto or register globals");
   case VarDecl::None:
   case VarDecl::Extern:
+  case VarDecl::PrivateExtern:
     // todo: common
     break;
   case VarDecl::Static:
index 99be5caf3f20efe341088e93611957791d16a40c..003554fbaa9696060e08e3552ec00b7d06edf1e6 100644 (file)
@@ -447,8 +447,7 @@ void Parser::ParseDeclarationSpecifiers(DeclSpec &DS) {
       isInvalid = DS.SetStorageClassSpec(DeclSpec::SCS_extern, Loc, PrevSpec);
       break;
     case tok::kw___private_extern__:
-         // FIXME: Implement private extern.
-      isInvalid = DS.SetStorageClassSpec(DeclSpec::SCS_extern, Loc, PrevSpec);
+      isInvalid = DS.SetStorageClassSpec(DeclSpec::SCS_private_extern, Loc, PrevSpec);
       break;
     case tok::kw_static:
       if (DS.isThreadSpecified())
index b38cd4cdb69686673e2f549555fed062396278ca..e674582eb0b658da8c56be70e55a8826de8534b7 100644 (file)
@@ -705,11 +705,12 @@ Sema::ActOnDeclarator(Scope *S, Declarator &D, DeclTy *lastDecl) {
     VarDecl::StorageClass SC;
     switch (D.getDeclSpec().getStorageClassSpec()) {
       default: assert(0 && "Unknown storage class!");
-      case DeclSpec::SCS_unspecified: SC = VarDecl::None; break;
-      case DeclSpec::SCS_extern:      SC = VarDecl::Extern; break;
-      case DeclSpec::SCS_static:      SC = VarDecl::Static; break;
-      case DeclSpec::SCS_auto:        SC = VarDecl::Auto; break;
-      case DeclSpec::SCS_register:    SC = VarDecl::Register; break;
+      case DeclSpec::SCS_unspecified:    SC = VarDecl::None; break;
+      case DeclSpec::SCS_extern:         SC = VarDecl::Extern; break;
+      case DeclSpec::SCS_static:         SC = VarDecl::Static; break;
+      case DeclSpec::SCS_auto:           SC = VarDecl::Auto; break;
+      case DeclSpec::SCS_register:       SC = VarDecl::Register; break;
+      case DeclSpec::SCS_private_extern: SC = VarDecl::PrivateExtern; break;
     }    
     if (S->getParent() == 0) {
       // C99 6.9p2: The storage-class specifiers auto and register shall not
index 0bd250d99b676b264bca28c6291eb0d86788fab3..9e78de3d2ee33d0fddc1714c4bf26d1f3ec2c7aa 100644 (file)
@@ -281,7 +281,7 @@ protected:
 class VarDecl : public ValueDecl {
 public:
   enum StorageClass {
-    None, Extern, Static, Auto, Register
+    None, Extern, Static, Auto, Register, PrivateExtern
   };
   StorageClass getStorageClass() const { return (StorageClass)SClass; }
 
index 307959f83a471ed612582d110a6b9327a94355ad..bb2773217e2e224b9b6e85670644cd201f077aed 100644 (file)
@@ -38,7 +38,8 @@ public:
     SCS_extern,
     SCS_static,
     SCS_auto,
-    SCS_register
+    SCS_register,
+    SCS_private_extern
   };
   
   // type-specifier