diff options
| author | Douglas Gregor <dgregor@apple.com> | 2010-02-19 15:18:45 +0000 |
|---|---|---|
| committer | Douglas Gregor <dgregor@apple.com> | 2010-02-19 15:18:45 +0000 |
| commit | cfd70242ca544c0738fabc55d17ace9fc1d5a7b9 (patch) | |
| tree | 40d4e4d0aba0c3c24fdfdd5a10229157c151bd28 /clang | |
| parent | d0bf6f640f6a2130cec017761321831db8c49455 (diff) | |
| download | bcm5719-llvm-cfd70242ca544c0738fabc55d17ace9fc1d5a7b9.tar.gz bcm5719-llvm-cfd70242ca544c0738fabc55d17ace9fc1d5a7b9.zip | |
Make Sema::ActOnClassMessage robust when name lookup for the receiver
name finds something other than a TypedefDecl or an
ObjCInterfaceDecl. This is a small part of <rdar://problem/7660386>.
llvm-svn: 96676
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/Sema/SemaExprObjC.cpp | 16 | ||||
| -rw-r--r-- | clang/test/SemaObjCXX/message.mm | 12 |
2 files changed, 20 insertions, 8 deletions
diff --git a/clang/lib/Sema/SemaExprObjC.cpp b/clang/lib/Sema/SemaExprObjC.cpp index 0c5d8efa288..3a05241c016 100644 --- a/clang/lib/Sema/SemaExprObjC.cpp +++ b/clang/lib/Sema/SemaExprObjC.cpp @@ -426,14 +426,14 @@ Sema::ExprResult Sema::ActOnClassMessage( if (!ClassDecl) { NamedDecl *IDecl = LookupSingleName(TUScope, receiverName, LookupOrdinaryName); - if (TypedefDecl *OCTD = dyn_cast_or_null<TypedefDecl>(IDecl)) { - const ObjCInterfaceType *OCIT; - OCIT = OCTD->getUnderlyingType()->getAs<ObjCInterfaceType>(); - if (!OCIT) { - Diag(receiverLoc, diag::err_invalid_receiver_to_message); - return true; - } - ClassDecl = OCIT->getDecl(); + if (TypedefDecl *OCTD = dyn_cast_or_null<TypedefDecl>(IDecl)) + if (const ObjCInterfaceType *OCIT + = OCTD->getUnderlyingType()->getAs<ObjCInterfaceType>()) + ClassDecl = OCIT->getDecl(); + + if (!ClassDecl) { + Diag(receiverLoc, diag::err_invalid_receiver_to_message); + return true; } } assert(ClassDecl && "missing interface declaration"); diff --git a/clang/test/SemaObjCXX/message.mm b/clang/test/SemaObjCXX/message.mm new file mode 100644 index 00000000000..6aa62c88ea6 --- /dev/null +++ b/clang/test/SemaObjCXX/message.mm @@ -0,0 +1,12 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s + +@interface I1 +- (void)method; +@end + +@implementation I1 +- (void)method { + struct x { }; + [x method]; // expected-error{{invalid receiver to message expression}} +} +@end |

