зеркало из https://github.com/microsoft/clang-1.git
Don't assert when diagnosing a missing cast of an unknown-anytype
message send to an unknown method. rdar://problem/9416370, redux. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@138893 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
a488497c7c
Коммит
819e74544a
|
@ -4639,9 +4639,12 @@ def err_sizeof_pack_no_pack_name_suggest : Error<
|
|||
def note_parameter_pack_here : Note<"parameter pack %0 declared here">;
|
||||
|
||||
def err_uncasted_use_of_unknown_any : Error<
|
||||
"%0 has unknown type; cast it to its declared type to use it">;
|
||||
"%0 has unknown type; cast it to its declared type to use it">;
|
||||
def err_uncasted_call_of_unknown_any : Error<
|
||||
"%0 has unknown return type; cast the call to its declared return type">;
|
||||
"%0 has unknown return type; cast the call to its declared return type">;
|
||||
def err_uncasted_send_to_unknown_any_method : Error<
|
||||
"no known method %select{%objcinstance1|%objcclass1}0; cast the "
|
||||
"message send to the method's return type">;
|
||||
def err_unsupported_unknown_any_decl : Error<
|
||||
"%0 has unknown type, which is unsupported for this kind of declaration">;
|
||||
def err_unsupported_unknown_any_expr : Error<
|
||||
|
|
|
@ -9942,7 +9942,12 @@ static ExprResult diagnoseUnknownAnyExpr(Sema &S, Expr *e) {
|
|||
diagID = diag::err_uncasted_call_of_unknown_any;
|
||||
loc = msg->getSelectorLoc();
|
||||
d = msg->getMethodDecl();
|
||||
assert(d && "unknown method returning __unknown_any?");
|
||||
if (!d) {
|
||||
S.Diag(loc, diag::err_uncasted_send_to_unknown_any_method)
|
||||
<< static_cast<unsigned>(msg->isClassMessage()) << msg->getSelector()
|
||||
<< orig->getSourceRange();
|
||||
return ExprError();
|
||||
}
|
||||
} else {
|
||||
S.Diag(e->getExprLoc(), diag::err_unsupported_unknown_any_expr)
|
||||
<< e->getSourceRange();
|
||||
|
|
|
@ -357,8 +357,9 @@ bool Sema::CheckMessageArgumentTypes(QualType ReceiverType,
|
|||
else
|
||||
DiagID = isClassMessage ? diag::warn_class_method_not_found
|
||||
: diag::warn_inst_method_not_found;
|
||||
Diag(lbrac, DiagID)
|
||||
<< Sel << isClassMessage << SourceRange(lbrac, rbrac);
|
||||
if (!getLangOptions().DebuggerSupport)
|
||||
Diag(lbrac, DiagID)
|
||||
<< Sel << isClassMessage << SourceRange(lbrac, rbrac);
|
||||
|
||||
// In debuggers, we want to use __unknown_anytype for these
|
||||
// results so that clients can cast them.
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
// RUN: %clang_cc1 -fdebugger-support -funknown-anytype -fsyntax-only -verify %s
|
||||
|
||||
// rdar://problem/9416370
|
||||
namespace test0 {
|
||||
void test(id x) {
|
||||
[x foo]; // expected-error {{no known method '-foo'; cast the message send to the method's return type}}
|
||||
}
|
||||
}
|
Загрузка…
Ссылка в новой задаче