]> granicus.if.org Git - clang/commitdiff
Forbid address-space-qualified function types, per TR 18037
authorPeter Collingbourne <peter@pcc.me.uk>
Wed, 27 Jul 2011 20:30:05 +0000 (20:30 +0000)
committerPeter Collingbourne <peter@pcc.me.uk>
Wed, 27 Jul 2011 20:30:05 +0000 (20:30 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@136257 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaType.cpp
test/Sema/address_spaces.c

index 25d7763be52ec910d2732f60d688478cece2e216..239bd45d222381d0cbdec0e0b2a244a5652a8e5e 100644 (file)
@@ -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<
index e44c6c8b4190135ef963c7e375390fc61de1b62d..2f93642d2f10c7bbef52f98ac3ccbdb051b51abc 100644 (file)
@@ -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;
index a53bb4da00034804c00f2988cb9ba1a53e5e9f68..24799daa9e509de3994a8b5769a351bdc3364fea 100644 (file)
@@ -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}}