summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn McCall <rjmccall@apple.com>2011-08-31 20:57:36 +0000
committerJohn McCall <rjmccall@apple.com>2011-08-31 20:57:36 +0000
commitfa6f5d6ab8c3f7ba54c1ca1fedc343c2b8b76359 (patch)
tree66106f3b05164e6d107ae8ccd34f30c60efceacf
parent64707fee222a122dffb3ab47ccf302d14429decd (diff)
downloadbcm5719-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.td7
-rw-r--r--clang/lib/Sema/SemaExpr.cpp7
-rw-r--r--clang/lib/Sema/SemaExprObjC.cpp5
-rw-r--r--clang/test/SemaObjCXX/unknown-anytype.mm8
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}}
+ }
+}
OpenPOWER on IntegriCloud