diff options
| author | John McCall <rjmccall@apple.com> | 2011-08-31 20:57:36 +0000 |
|---|---|---|
| committer | John McCall <rjmccall@apple.com> | 2011-08-31 20:57:36 +0000 |
| commit | fa6f5d6ab8c3f7ba54c1ca1fedc343c2b8b76359 (patch) | |
| tree | 66106f3b05164e6d107ae8ccd34f30c60efceacf | |
| parent | 64707fee222a122dffb3ab47ccf302d14429decd (diff) | |
| download | bcm5719-llvm-fa6f5d6ab8c3f7ba54c1ca1fedc343c2b8b76359.tar.gz bcm5719-llvm-fa6f5d6ab8c3f7ba54c1ca1fedc343c2b8b76359.zip | |
Don't assert when diagnosing a missing cast of an unknown-anytype
message send to an unknown method.
rdar://problem/9416370, redux.
llvm-svn: 138893
| -rw-r--r-- | clang/include/clang/Basic/DiagnosticSemaKinds.td | 7 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 7 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaExprObjC.cpp | 5 | ||||
| -rw-r--r-- | clang/test/SemaObjCXX/unknown-anytype.mm | 8 |
4 files changed, 22 insertions, 5 deletions
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 89bc1064508..d5f1564e6ac 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -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< diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index d94e10b0096..928b11bd0b6 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -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(); diff --git a/clang/lib/Sema/SemaExprObjC.cpp b/clang/lib/Sema/SemaExprObjC.cpp index 402e54c0e80..aa9b4748a03 100644 --- a/clang/lib/Sema/SemaExprObjC.cpp +++ b/clang/lib/Sema/SemaExprObjC.cpp @@ -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. diff --git a/clang/test/SemaObjCXX/unknown-anytype.mm b/clang/test/SemaObjCXX/unknown-anytype.mm new file mode 100644 index 00000000000..163dddee708 --- /dev/null +++ b/clang/test/SemaObjCXX/unknown-anytype.mm @@ -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}} + } +} |

