From fc479d793b5daa20bbf54651b83a90e77e907949 Mon Sep 17 00:00:00 2001 From: Steve Naroff Date: Mon, 6 Apr 2009 22:07:54 +0000 Subject: [PATCH] Make casting 'super' a deprecated warning (instead of a hard error). This will simplify clang adoption, and is probably better "etiquette" (since gcc has always accepted this idiom without warning). Once we are over the adoption hurdle, we can turn this into an error. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@68468 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Basic/DiagnosticSemaKinds.td | 4 ++-- lib/Sema/SemaExpr.cpp | 2 +- test/SemaObjC/call-super-2.m | 19 +++++++++++-------- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index 1bdabadf45..b51162ae94 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -1020,8 +1020,8 @@ def err_catch_param_not_objc_type : Error< "@catch parameter is not an Objective-C class type">; def err_illegal_qualifiers_on_catch_parm : Error< "illegal qualifiers on @catch parameter">; -def err_illegal_super_cast : Error< - "cannot cast 'super' (it isn't an expression)">; +def warn_super_cast_deprecated : Warning< + "casting 'super' is deprecated (it isn't an expression)">; // C++ casts diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index e836a58432..f348f86498 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -2500,7 +2500,7 @@ bool Sema::CheckCastTypes(SourceRange TyR, QualType castType, Expr *&castExpr) { if (CheckVectorCast(TyR, castType, castExpr->getType())) return true; } else if (getLangOptions().ObjC1 && isa(castExpr)) { - return Diag(castExpr->getLocStart(), diag::err_illegal_super_cast) << TyR; + Diag(castExpr->getLocStart(), diag::warn_super_cast_deprecated) << TyR; } return false; } diff --git a/test/SemaObjC/call-super-2.m b/test/SemaObjC/call-super-2.m index 6b1804b3e2..cc66cf3f21 100644 --- a/test/SemaObjC/call-super-2.m +++ b/test/SemaObjC/call-super-2.m @@ -2,7 +2,10 @@ #include -typedef struct objc_object *id; +typedef struct objc_class *Class; +typedef struct objc_object { + Class isa; +} *id; id objc_getClass(const char *s); @interface Object @@ -39,17 +42,17 @@ id objc_getClass(const char *s); + (int) class_func2 { int i = [(id )self class_func0]; // expected-warning {{method '-class_func0' not found (return type defaults to 'id')}} // expected-warning {{incompatible pointer to integer conversion initializing 'id', expected 'int'}} - i += [(id )super class_func0]; // expected-error {{cannot cast 'super' (it isn't an expression)}} + i += [(id )super class_func0]; // expected-warning {{casting 'super' is deprecated (it isn't an expression)}} // expected-warning {{method '-class_func0' not found (return type defaults to 'id')}} // expected-warning {{incompatible pointer to integer conversion assigning 'id', expected 'int'}} i += [(Class )self class_func0]; // expected-error {{protocol qualified 'Class' is unsupported}} - return i + [(Class )super class_func0]; // expected-error {{protocol qualified 'Class' is unsupported}} // expected-error {{cannot cast 'super' (it isn't an expression)}} + return i + [(Class )super class_func0]; // expected-error {{protocol qualified 'Class' is unsupported}} // expected-warning {{casting 'super' is deprecated (it isn't an expression)}} } + (int) class_func3 { - return [(Object *)super class_func0]; // expected-error {{cannot cast 'super' (it isn't an expression)}} + return [(Object *)super class_func0]; // expected-warning {{casting 'super' is deprecated (it isn't an expression)}} // expected-warning {{method '-class_func0' not found (return type defaults to 'id')}} // expected-warning {{incompatible pointer to integer conversion returning 'id', expected 'int'}} } + (int) class_func4 { - return [(Derived *)super class_func0]; // expected-error {{cannot cast 'super' (it isn't an expression)}} + return [(Derived *)super class_func0]; // expected-warning {{casting 'super' is deprecated (it isn't an expression)}} // expected-warning {{method '-class_func0' not found (return type defaults to 'id')}} // expected-warning {{incompatible pointer to integer conversion returning 'id', expected 'int'}} } + (int) class_func5 { @@ -71,15 +74,15 @@ id objc_getClass(const char *s); } - (int) instance_func2 { - return [(id )super instance_func0]; // expected-error {{cannot cast 'super' (it isn't an expression)}} + return [(id )super instance_func0]; // expected-warning {{casting 'super' is deprecated (it isn't an expression)}} } - (int) instance_func3 { - return [(Object *)super instance_func0]; // expected-error {{cannot cast 'super' (it isn't an expression)}} + return [(Object *)super instance_func0]; // expected-warning {{casting 'super' is deprecated (it isn't an expression)}} } - (int) instance_func4 { - return [(Derived *)super instance_func0]; // expected-error {{cannot cast 'super' (it isn't an expression)}} + return [(Derived *)super instance_func0]; // expected-warning {{casting 'super' is deprecated (it isn't an expression)}} } - (int) instance_func5 { -- 2.40.0