]> granicus.if.org Git - clang/commitdiff
Set register storage class correctly for function parameters.
authorDaniel Dunbar <daniel@zuster.org>
Wed, 3 Sep 2008 21:54:21 +0000 (21:54 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Wed, 3 Sep 2008 21:54:21 +0000 (21:54 +0000)
 - PR2730

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

lib/Sema/SemaDecl.cpp
test/Sema/expr-address-of.c

index cc1ace7b339b404c40a9ef1213ad8d5baf7df51c..b45611ca59b5d2622bec23587a5e631d000c3fde 100644 (file)
@@ -1421,8 +1421,10 @@ Sema::ActOnParamDeclarator(Scope *S, Declarator &D) {
   const DeclSpec &DS = D.getDeclSpec();
   
   // Verify C99 6.7.5.3p2: The only SCS allowed is 'register'.
-  if (DS.getStorageClassSpec() != DeclSpec::SCS_unspecified &&
-      DS.getStorageClassSpec() != DeclSpec::SCS_register) {
+  VarDecl::StorageClass StorageClass = VarDecl::None;
+  if (DS.getStorageClassSpec() == DeclSpec::SCS_register) {
+    StorageClass = VarDecl::Register;
+  } else if (DS.getStorageClassSpec() != DeclSpec::SCS_unspecified) {
     Diag(DS.getStorageClassSpecLoc(),
          diag::err_invalid_storage_class_in_func_decl);
     D.getMutableDeclSpec().ClearStorageClassSpecs();
@@ -1485,7 +1487,7 @@ Sema::ActOnParamDeclarator(Scope *S, Declarator &D) {
   
   ParmVarDecl *New = ParmVarDecl::Create(Context, CurContext, 
                                          D.getIdentifierLoc(), II,
-                                         parmDeclType, VarDecl::None
+                                         parmDeclType, StorageClass
                                          0, 0);
   
   if (D.getInvalidType())
index 20390429dd246d3bbb1f5a06d6d60e8998875edd..58bc540a30d57c9b26ec5223810a132d2d1d8b48 100644 (file)
@@ -86,3 +86,6 @@ void f5() {
   int *_dummy1 = &(arr + 1); // expected-error {{address expression must be an lvalue or a function designator}}
 }
 
+void f6(register int x) {
+  int * dummy0 = &x; // expected-error {{address of register variable requested}}
+}