diff options
| author | Peter Collingbourne <peter@pcc.me.uk> | 2011-07-27 20:30:05 +0000 |
|---|---|---|
| committer | Peter Collingbourne <peter@pcc.me.uk> | 2011-07-27 20:30:05 +0000 |
| commit | 8f5f520653f5dcbaf0a5673fcb3497ec9cb25dad (patch) | |
| tree | 269851dd3c636a3c6c2c65c24d6362d36eaa69da | |
| parent | 78769e691ae2507fd594f93d82a2d9945fd1b364 (diff) | |
| download | bcm5719-llvm-8f5f520653f5dcbaf0a5673fcb3497ec9cb25dad.tar.gz bcm5719-llvm-8f5f520653f5dcbaf0a5673fcb3497ec9cb25dad.zip | |
Forbid address-space-qualified function types, per TR 18037
llvm-svn: 136257
| -rw-r--r-- | clang/include/clang/Basic/DiagnosticSemaKinds.td | 2 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaType.cpp | 8 | ||||
| -rw-r--r-- | clang/test/Sema/address_spaces.c | 4 |
3 files changed, 14 insertions, 0 deletions
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 25d7763be52..239bd45d222 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -1195,6 +1195,8 @@ def err_attribute_address_space_too_high : Error< "address space is larger than the maximum supported (%0)">; def err_attribute_address_multiple_qualifiers : Error< "multiple address spaces specified for type">; +def err_attribute_address_function_type : Error< + "function type may not be qualified with an address space">; def err_as_qualified_auto_decl : Error< "automatic variable qualified with an address space">; def err_arg_with_address_space : Error< diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index e44c6c8b419..2f93642d2f1 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -3072,6 +3072,14 @@ static void HandleAddressSpaceTypeAttribute(QualType &Type, return; } + // ISO/IEC TR 18037 S5.3 (amending C99 6.7.3): "A function type shall not be + // qualified by an address-space qualifier." + if (Type->isFunctionType()) { + S.Diag(Attr.getLoc(), diag::err_attribute_address_function_type); + Attr.setInvalid(); + return; + } + // Check the attribute arguments. if (Attr.getNumArgs() != 1) { S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1; diff --git a/clang/test/Sema/address_spaces.c b/clang/test/Sema/address_spaces.c index a53bb4da000..24799daa9e5 100644 --- a/clang/test/Sema/address_spaces.c +++ b/clang/test/Sema/address_spaces.c @@ -44,3 +44,7 @@ void test3(void) { extern void test3_helper(char *p); // expected-note {{passing argument to parameter 'p' here}} test3_helper(test3_array); // expected-error {{changes address space of pointer}} } + +typedef void ft(void); +_AS1 ft qf; // expected-error {{function type may not be qualified with an address space}} +typedef _AS1 ft qft; // expected-error {{function type may not be qualified with an address space}} |

