diff options
-rw-r--r-- | clang/lib/Lex/PPMacroExpansion.cpp | 5 | ||||
-rw-r--r-- | clang/lib/Sema/SemaCodeComplete.cpp | 3 | ||||
-rw-r--r-- | clang/test/Index/Inputs/module-undef.h | 2 | ||||
-rw-r--r-- | clang/test/Index/Inputs/module.map | 2 | ||||
-rw-r--r-- | clang/test/Index/complete-module-undef.m | 8 |
5 files changed, 18 insertions, 2 deletions
diff --git a/clang/lib/Lex/PPMacroExpansion.cpp b/clang/lib/Lex/PPMacroExpansion.cpp index 62d2da56ba9..e875860f820 100644 --- a/clang/lib/Lex/PPMacroExpansion.cpp +++ b/clang/lib/Lex/PPMacroExpansion.cpp @@ -49,7 +49,10 @@ void Preprocessor::appendMacroDirective(IdentifierInfo *II, MacroDirective *MD){ MacroDirective *&StoredMD = Macros[II]; MD->setPrevious(StoredMD); StoredMD = MD; - II->setHasMacroDefinition(MD->isDefined()); + // Setup the identifier as having associated macro history. + II->setHasMacroDefinition(true); + if (!MD->isDefined()) + II->setHasMacroDefinition(false); bool isImportedMacro = isa<DefMacroDirective>(MD) && cast<DefMacroDirective>(MD)->isImported(); if (II->isFromAST() && !isImportedMacro) diff --git a/clang/lib/Sema/SemaCodeComplete.cpp b/clang/lib/Sema/SemaCodeComplete.cpp index 3d250e3bef1..10b243cd509 100644 --- a/clang/lib/Sema/SemaCodeComplete.cpp +++ b/clang/lib/Sema/SemaCodeComplete.cpp @@ -2575,11 +2575,12 @@ CodeCompletionResult::CreateCodeCompletionString(ASTContext &Ctx, const MacroDirective *MD = PP.getMacroDirectiveHistory(Macro); assert(MD && "Not a macro?"); const MacroInfo *MI = MD->getMacroInfo(); + assert((!MD->isDefined() || MI) && "missing MacroInfo for define"); Result.AddTypedTextChunk( Result.getAllocator().CopyString(Macro->getName())); - if (!MI->isFunctionLike()) + if (!MI || !MI->isFunctionLike()) return Result.TakeString(); // Format a function-like macro with placeholders for the arguments. diff --git a/clang/test/Index/Inputs/module-undef.h b/clang/test/Index/Inputs/module-undef.h new file mode 100644 index 00000000000..8212d755a0f --- /dev/null +++ b/clang/test/Index/Inputs/module-undef.h @@ -0,0 +1,2 @@ +#define MY_MACRO 1 +#undef MY_MACRO diff --git a/clang/test/Index/Inputs/module.map b/clang/test/Index/Inputs/module.map index 8f24840c81f..4bfc109a8b1 100644 --- a/clang/test/Index/Inputs/module.map +++ b/clang/test/Index/Inputs/module.map @@ -4,3 +4,5 @@ module ModuleNeedsVFS { export * } framework module * { } + +module ModuleUndef { header "module-undef.h" } diff --git a/clang/test/Index/complete-module-undef.m b/clang/test/Index/complete-module-undef.m new file mode 100644 index 00000000000..a9dd0009641 --- /dev/null +++ b/clang/test/Index/complete-module-undef.m @@ -0,0 +1,8 @@ +// RUN: rm -rf %t +// RUN: env CINDEXTEST_COMPLETION_CACHING=1 \ +// RUN: c-index-test -test-load-source-reparse 2 local %s -fmodules -fmodules-cache-path=%t -I %S/Inputs \ +// RUN: | FileCheck %s + +// rdar://18416901 (used to crash) +// CHECK: complete-module-undef.m:8:1: ModuleImport=ModuleUndef:8:1 (Definition) Extent=[8:1 - 8:20] +@import ModuleUndef; |