]> granicus.if.org Git - clang/commitdiff
- Generate error for protocol qualifiers on 'Class'.
authorSteve Naroff <snaroff@apple.com>
Mon, 23 Feb 2009 18:53:24 +0000 (18:53 +0000)
committerSteve Naroff <snaroff@apple.com>
Mon, 23 Feb 2009 18:53:24 +0000 (18:53 +0000)
- Generate error for protocol qualifiers on non-ObjC types.

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

include/clang/Basic/DiagnosticSemaKinds.def
lib/Sema/SemaType.cpp
test/SemaObjC/protocol-archane.m
test/SemaObjC/protocol-atttribute-1.m

index 2549df6b93b403ee873704ccb1b1abcab68c2c26..ab1ed607170365b2beb96892d03bbd801ef5b331 100644 (file)
@@ -1400,6 +1400,8 @@ DIAG(warn_objc_array_of_interfaces, WARNING,
      "array of interface %0 should probably be an array of pointers")
 DIAG(ext_c99_array_usage, EXTENSION,
      "use of C99-specific array features, accepted as an extension")
-DIAG(warn_ignoring_objc_qualifiers, WARNING,
-     "ignoring protocol qualifiers on non-ObjC type")
+DIAG(err_invalid_protocol_qualifiers, ERROR,
+     "invalid protocol qualifiers on non-ObjC type")
+DIAG(err_qualified_class_unsupported, ERROR,
+     "protocol qualified 'Class' is unsupported")
 
index acdeec6ba94dfecd055c2ee627acef9d99fc7a2c..f8b277ae78172958de76fc7eda285ca396a0f52f 100644 (file)
@@ -151,9 +151,13 @@ QualType Sema::ConvertDeclSpecToType(const DeclSpec &DS) {
         // id<protocol-list>
         Result = Context.getObjCQualifiedIdType((ObjCProtocolDecl**)PQ,
                                                 DS.getNumProtocolQualifiers());
-      else
+      else if (Result == Context.getObjCClassType())
+        // Class<protocol-list>
         Diag(DS.getSourceRange().getBegin(), 
-             diag::warn_ignoring_objc_qualifiers) << DS.getSourceRange();
+             diag::err_qualified_class_unsupported) << DS.getSourceRange();
+      else
+        Diag(DS.getSourceRange().getBegin(),
+             diag::err_invalid_protocol_qualifiers) << DS.getSourceRange();
     }
     // TypeQuals handled by caller.
     break;
index 2cba1fad051fc9cf850b7943065eef8b1dbfff38..647c5e74a651fc866887c989e3d356af590b33f6 100644 (file)
@@ -26,4 +26,10 @@ void foo(id x) {
 typedef int NotAnObjCObjectType;
 
 // GCC doesn't diagnose this.
-NotAnObjCObjectType <SomeProtocol> *obj; // expected-warning {{ignoring protocol qualifiers on non-ObjC type}}
+NotAnObjCObjectType <SomeProtocol> *obj; // expected-error {{invalid protocol qualifiers on non-ObjC type}}
+
+// Decided not to support the following GCC extension. Found while researching rdar://6497631
+typedef struct objc_class *Class;
+
+Class <SomeProtocol> UnfortunateGCCExtension; // expected-error {{protocol qualified 'Class' is unsupported}}
+
index 1d3aec64c424a2fa0c06f763e1f40a2743c36d73..1934091fe934f949ae3c2855a2d32bfa9787a697 100644 (file)
@@ -3,7 +3,7 @@
 __attribute ((unavailable))
 @protocol FwProto; // expected-note{{marked unavailable}}
 
-Class <FwProto> cFw = 0;  // expected-warning {{'FwProto' is unavailable}} expected-warning{{ignoring protocol qualifiers on non-ObjC type}}
+Class <FwProto> cFw = 0;  // expected-warning {{'FwProto' is unavailable}} expected-error{{protocol qualified 'Class' is unsupported}}
 
 
 __attribute ((deprecated)) @protocol MyProto1
@@ -31,7 +31,7 @@ __attribute ((deprecated)) @protocol MyProto1
 
 
 
-Class <MyProto1> clsP1 = 0;  // expected-warning {{'MyProto1' is deprecated}} expected-warning{{ignoring protocol qualifiers on non-ObjC type}}
+Class <MyProto1> clsP1 = 0;  // expected-warning {{'MyProto1' is deprecated}} expected-error{{protocol qualified 'Class' is unsupported}}
 
 @protocol FwProto @end // expected-note{{marked unavailable}}