diff --git a/clang/lib/Lex/Preprocessor.cpp b/clang/lib/Lex/Preprocessor.cpp index 7d789e780113..08469bc02530 100644 --- a/clang/lib/Lex/Preprocessor.cpp +++ b/clang/lib/Lex/Preprocessor.cpp @@ -773,8 +773,13 @@ void Preprocessor::Lex(Token &Result) { } } while (!ReturnedToken); - if (Result.is(tok::code_completion)) + if (Result.is(tok::code_completion) && Result.getIdentifierInfo()) { + // Remember the identifier before code completion token. setCodeCompletionIdentifierInfo(Result.getIdentifierInfo()); + // Set IdenfitierInfo to null to avoid confusing code that handles both + // identifiers and completion tokens. + Result.setIdentifierInfo(nullptr); + } LastTokenWasAt = Result.is(tok::at); } diff --git a/clang/test/CodeCompletion/inside-macros.cpp b/clang/test/CodeCompletion/inside-macros.cpp new file mode 100644 index 000000000000..dc40c6ad318c --- /dev/null +++ b/clang/test/CodeCompletion/inside-macros.cpp @@ -0,0 +1,13 @@ +#define ID(X) X + +void test(bool input_var) { + ID(input_var) = true; + // Check that input_var shows up when completing at the start, in the middle + // and at the end of the identifier. + // + // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:4:6 %s -o - | FileCheck %s + // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:4:8 %s -o - | FileCheck %s + // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:4:15 %s -o - | FileCheck %s + + // CHECK: input_var +}