From 4262a07621043c19292f5fd90b1e426d65cd366c Mon Sep 17 00:00:00 2001 From: Steve Naroff Date: Mon, 23 Feb 2009 18:53:24 +0000 Subject: [PATCH] - Generate error for protocol qualifiers on 'Class'. - 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 | 6 ++++-- lib/Sema/SemaType.cpp | 8 ++++++-- test/SemaObjC/protocol-archane.m | 8 +++++++- 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 Result = Context.getObjCQualifiedIdType((ObjCProtocolDecl**)PQ, DS.getNumProtocolQualifiers()); - else + else if (Result == Context.getObjCClassType()) + // Class 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 *obj; // expected-warning {{ignoring protocol qualifiers on non-ObjC type}} +NotAnObjCObjectType *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 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 cFw = 0; // expected-warning {{'FwProto' is unavailable}} expected-warning{{ignoring protocol qualifiers on non-ObjC type}} +Class 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 clsP1 = 0; // expected-warning {{'MyProto1' is deprecated}} expected-warning{{ignoring protocol qualifiers on non-ObjC type}} +Class clsP1 = 0; // expected-warning {{'MyProto1' is deprecated}} expected-error{{protocol qualified 'Class' is unsupported}} @protocol FwProto @end // expected-note{{marked unavailable}} -- 2.40.0