diff options
-rw-r--r-- | include/clang/Basic/DiagnosticSemaKinds.def | 6 | ||||
-rw-r--r-- | lib/Sema/SemaType.cpp | 8 | ||||
-rw-r--r-- | test/SemaObjC/protocol-archane.m | 8 | ||||
-rw-r--r-- | test/SemaObjC/protocol-atttribute-1.m | 4 |
4 files changed, 19 insertions, 7 deletions
diff --git a/include/clang/Basic/DiagnosticSemaKinds.def b/include/clang/Basic/DiagnosticSemaKinds.def index 2549df6b93..ab1ed60717 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.def +++ b/include/clang/Basic/DiagnosticSemaKinds.def @@ -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") diff --git a/lib/Sema/SemaType.cpp b/lib/Sema/SemaType.cpp index acdeec6ba9..f8b277ae78 100644 --- a/lib/Sema/SemaType.cpp +++ b/lib/Sema/SemaType.cpp @@ -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; diff --git a/test/SemaObjC/protocol-archane.m b/test/SemaObjC/protocol-archane.m index 2cba1fad05..647c5e74a6 100644 --- a/test/SemaObjC/protocol-archane.m +++ b/test/SemaObjC/protocol-archane.m @@ -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}} + diff --git a/test/SemaObjC/protocol-atttribute-1.m b/test/SemaObjC/protocol-atttribute-1.m index 1d3aec64c4..1934091fe9 100644 --- a/test/SemaObjC/protocol-atttribute-1.m +++ b/test/SemaObjC/protocol-atttribute-1.m @@ -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}} |