From 7a4bb7efcd280e94475501186889242e5ca16d36 Mon Sep 17 00:00:00 2001 From: Argyrios Kyrtzidis Date: Wed, 4 Mar 2015 16:03:07 +0000 Subject: [PATCH] [Modules] Fix crash in Preprocessor::getLastMacroWithSpelling(). Macro names that got undefined inside a module may not have their MacroInfo set. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@231251 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Lex/Preprocessor.cpp | 6 +++--- .../Inputs/Module.framework/Headers/Module.h | 3 +++ test/Modules/crashes.m | 14 ++++++++++++++ 3 files changed, 20 insertions(+), 3 deletions(-) create mode 100644 test/Modules/crashes.m diff --git a/lib/Lex/Preprocessor.cpp b/lib/Lex/Preprocessor.cpp index b2a6d933a0..51a038ac72 100644 --- a/lib/Lex/Preprocessor.cpp +++ b/lib/Lex/Preprocessor.cpp @@ -321,11 +321,11 @@ StringRef Preprocessor::getLastMacroWithSpelling( StringRef BestSpelling; for (Preprocessor::macro_iterator I = macro_begin(), E = macro_end(); I != E; ++I) { - if (!I->second->getMacroInfo()->isObjectLike()) - continue; const MacroDirective::DefInfo Def = I->second->findDirectiveAtLoc(Loc, SourceMgr); - if (!Def) + if (!Def || !Def.getMacroInfo()) + continue; + if (!Def.getMacroInfo()->isObjectLike()) continue; if (!MacroDefinitionEquals(Def.getMacroInfo(), Tokens)) continue; diff --git a/test/Modules/Inputs/Module.framework/Headers/Module.h b/test/Modules/Inputs/Module.framework/Headers/Module.h index 9a1c2b9bd8..55ce7a3e30 100644 --- a/test/Modules/Inputs/Module.framework/Headers/Module.h +++ b/test/Modules/Inputs/Module.framework/Headers/Module.h @@ -31,4 +31,7 @@ typedef struct __sFILE { extern FILE *myFile; +#define SOME_MACRO_GETTING_UNDEFINED 1 +#undef SOME_MACRO_GETTING_UNDEFINED + #endif // MODULE_H diff --git a/test/Modules/crashes.m b/test/Modules/crashes.m new file mode 100644 index 0000000000..cfdd1b2a54 --- /dev/null +++ b/test/Modules/crashes.m @@ -0,0 +1,14 @@ +// RUN: rm -rf %t.mcp +// RUN: %clang_cc1 -fmodules-cache-path=%t.mcp -fmodules -F %S/Inputs -fobjc-arc %s -verify + +@import Module; + +__attribute__((objc_root_class)) +@interface Test +// rdar://19904648 +@property (assign) id newFile; // expected-error {{property follows Cocoa naming convention for returning 'owned' objects}} \ + // expected-note {{explicitly declare getter}} +@end + +@implementation Test +@end -- 2.40.0