diff options
author | Daniel Dunbar <daniel@zuster.org> | 2008-09-03 21:54:21 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2008-09-03 21:54:21 +0000 |
commit | 0ff4192f3a37d05878c451312ee5fa42787da50f (patch) | |
tree | 2eec00e76dd655b7a5df332a4a474c962917b177 /clang | |
parent | b44763456c0b0ec2990a68663405088463746866 (diff) | |
download | bcm5719-llvm-0ff4192f3a37d05878c451312ee5fa42787da50f.tar.gz bcm5719-llvm-0ff4192f3a37d05878c451312ee5fa42787da50f.zip |
Set register storage class correctly for function parameters.
- PR2730
llvm-svn: 55739
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/Sema/SemaDecl.cpp | 8 | ||||
-rw-r--r-- | clang/test/Sema/expr-address-of.c | 3 |
2 files changed, 8 insertions, 3 deletions
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index cc1ace7b339..b45611ca59b 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -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()) diff --git a/clang/test/Sema/expr-address-of.c b/clang/test/Sema/expr-address-of.c index 20390429dd2..58bc540a30d 100644 --- a/clang/test/Sema/expr-address-of.c +++ b/clang/test/Sema/expr-address-of.c @@ -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}} +} |