]> granicus.if.org Git - clang/commitdiff
improve the diagnostic for uses of the GCC "global variable in a register" extension.
authorChris Lattner <sabre@nondot.org>
Tue, 12 May 2009 21:44:00 +0000 (21:44 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 12 May 2009 21:44:00 +0000 (21:44 +0000)
This implements rdar://6880449 - improve diagnostic for usage of "global register variable" GCC extension

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@71599 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaDecl.cpp
test/Sema/decl-invalid.c

index 65a25ce93473996a369627e921ac44f69fbbb066..ed56cad330e63d0c47d91711b041ecf10f84d5b8 100644 (file)
@@ -1023,6 +1023,8 @@ def warn_tentative_incomplete_array : Warning<
 def err_realimag_invalid_type : Error<"invalid type %0 to %1 operator">;
 def err_typecheck_sclass_fscope : Error<
   "illegal storage class on file-scoped variable">;
+def err_unsupported_global_register : Error<
+  "global register variables are not supported">;
 def err_typecheck_sclass_func : Error<"illegal storage class on function">;
 def err_static_block_func : Error<
   "function declared in block scope cannot have 'static' storage class">;
index d8b6f45e37a9d44fb924b939b95a23aeeea85612..b233021c42b9413c18bdf38ed771668144aae54a 100644 (file)
@@ -1742,7 +1742,13 @@ Sema::ActOnVariableDeclarator(Scope* S, Declarator& D, DeclContext* DC,
     // C99 6.9p2: The storage-class specifiers auto and register shall not
     // appear in the declaration specifiers in an external declaration.
     if (SC == VarDecl::Auto || SC == VarDecl::Register) {
-      Diag(D.getIdentifierLoc(), diag::err_typecheck_sclass_fscope);
+      
+      // If this is a register variable with an asm label specified, then this
+      // is a GNU extension.
+      if (SC == VarDecl::Register && D.getAsmLabel())
+        Diag(D.getIdentifierLoc(), diag::err_unsupported_global_register);
+      else
+        Diag(D.getIdentifierLoc(), diag::err_typecheck_sclass_fscope);
       D.setInvalidType();
     }
   }
index e14bc9891a455840ed83e0e5ebaf59bc81a6a18a..051f0f7ffbccfc13759a85583782b80b9940508e 100644 (file)
@@ -20,3 +20,10 @@ const int; // expected-error {{declaration does not declare anything}}
 struct; // expected-error {{declaration of anonymous struct must be a definition}} // expected-error {{declaration does not declare anything}}
 typedef int I;
 I; // expected-error {{declaration does not declare anything}}
+
+
+
+// rdar://6880449
+register int test1;     // expected-error {{illegal storage class on file-scoped variable}}
+register int test2 __asm__("edi");  // expected-error {{global register variables are not supported}}
+