forked from OSchip/llvm-project
[ObjC] Add a -Wobjc-messaging-id warning
-Wobjc-messaging-id is a new, non-default warning that warns about message sends to unqualified id in Objective-C. This warning is useful for projects that would like to avoid any potential future compiler errors/warnings, as the system frameworks might add a method with the same selector which could make the message send to id ambiguous. rdar://33303354 llvm-svn: 311779
This commit is contained in:
parent
d0e27266d8
commit
d9f1284009
|
@ -66,6 +66,12 @@ Improvements to Clang's diagnostics
|
|||
a non-default alignment that has been specified using a ``#pragma pack``
|
||||
directive prior to the ``#include``.
|
||||
|
||||
- ``-Wobjc-messaging-id`` is a new, non-default warning that warns about
|
||||
message sends to unqualified ``id`` in Objective-C. This warning is useful
|
||||
for projects that would like to avoid any potential future compiler
|
||||
errors/warnings, as the system frameworks might add a method with the same
|
||||
selector which could make the message send to ``id`` ambiguous.
|
||||
|
||||
Non-comprehensive list of changes in this release
|
||||
-------------------------------------------------
|
||||
|
||||
|
|
|
@ -1211,6 +1211,10 @@ def err_objc_method_unsupported_param_ret_type : Error<
|
|||
"%0 %select{parameter|return}1 type is unsupported; "
|
||||
"support for vector types for this target is introduced in %2">;
|
||||
|
||||
def warn_messaging_unqualified_id : Warning<
|
||||
"messaging unqualified id">, DefaultIgnore,
|
||||
InGroup<DiagGroup<"objc-messaging-id">>;
|
||||
|
||||
// C++ declarations
|
||||
def err_static_assert_expression_is_not_constant : Error<
|
||||
"static_assert expression is not an integral constant expression">;
|
||||
|
|
|
@ -2705,6 +2705,9 @@ ExprResult Sema::BuildInstanceMessage(Expr *Receiver,
|
|||
}
|
||||
}
|
||||
|
||||
if (ReceiverType->isObjCIdType() && !isImplicit)
|
||||
Diag(Receiver->getExprLoc(), diag::warn_messaging_unqualified_id);
|
||||
|
||||
// There's a somewhat weird interaction here where we assume that we
|
||||
// won't actually have a method unless we also don't need to do some
|
||||
// of the more detailed type-checking on the receiver.
|
||||
|
|
|
@ -0,0 +1,21 @@
|
|||
// RUN: %clang_cc1 -fsyntax-only -verify -Wno-objc-root-class -Wobjc-messaging-id %s
|
||||
|
||||
@interface CallMeMaybe
|
||||
|
||||
- (void)doThing:(int)intThing;
|
||||
|
||||
@property int thing;
|
||||
|
||||
@end
|
||||
|
||||
template<typename T>
|
||||
void instantiate(const T &x) {
|
||||
[x setThing: 22]; // expected-warning {{messaging unqualified id}}
|
||||
}
|
||||
|
||||
void fn() {
|
||||
id myObject;
|
||||
[myObject doThing: 10]; // expected-warning {{messaging unqualified id}}
|
||||
[myObject setThing: 11]; // expected-warning {{messaging unqualified id}}
|
||||
instantiate(myObject); // expected-note {{in instantiation}}
|
||||
}
|
Loading…
Reference in New Issue