diff --git a/.clangd b/.clangd new file mode 100644 index 00000000000000..7058e79de5e5ac --- /dev/null +++ b/.clangd @@ -0,0 +1,2 @@ +CompileFlags: + Add: [-std=c++20] \ No newline at end of file diff --git a/clang/lib/Parse/ParseDeclCXX.cpp b/clang/lib/Parse/ParseDeclCXX.cpp index 6f0f5a0311bc18..caeadeb46c73ed 100644 --- a/clang/lib/Parse/ParseDeclCXX.cpp +++ b/clang/lib/Parse/ParseDeclCXX.cpp @@ -460,6 +460,18 @@ Decl *Parser::ParseExportDeclaration() { assert(Tok.is(tok::kw_export)); SourceLocation ExportLoc = ConsumeToken(); + if (Tok.is(tok::code_completion)) { + cutOffParsing(); + SemaCodeCompletion::ParserCompletionContext PCC; + if (PP.isIncrementalProcessingEnabled()) { + PCC = SemaCodeCompletion::PCC_TopLevelOrExpression; + } else { + PCC = SemaCodeCompletion::PCC_Namespace; + }; + Actions.CodeCompletion().CodeCompleteOrdinaryName(getCurScope(), PCC); + return nullptr; + } + ParseScope ExportScope(this, Scope::DeclScope); Decl *ExportDecl = Actions.ActOnStartExportDecl( getCurScope(), ExportLoc, diff --git a/clang/test/CodeCompletion/keywords-cxx20.cpp b/clang/test/CodeCompletion/keywords-cxx20.cpp index b8ffb6f618260f..612c3c0045e394 100644 --- a/clang/test/CodeCompletion/keywords-cxx20.cpp +++ b/clang/test/CodeCompletion/keywords-cxx20.cpp @@ -2,7 +2,7 @@ module; export module M; -const char8_t x = 1; +export const char8_t x = 1; template requires true const int y = requires { typename T::type; requires T::value; }; @@ -17,19 +17,22 @@ module: private; // CHECK-MODULE1: module; // CHECK-MODULE1: module <#name#>; +// RUN: %clang_cc1 -std=c++20 -code-completion-at=%s:3:11 %s | FileCheck --check-prefix=CHECK-MODULE2 %s +// CHECK-MODULE2: module <#name#>; + // RUN: %clang_cc1 -std=c++20 -code-completion-at=%s:14:3 %s | FileCheck --check-prefix=CHECK-MODULE3 %s // CHECK-MODULE3: module: private; // RUN: %clang_cc1 -std=c++20 -code-completion-at=%s:3:3 %s | FileCheck --check-prefix=CHECK-EXPORT %s // CHECK-EXPORT: export -// RUN: %clang_cc1 -std=c++20 -code-completion-at=%s:5:3 %s | FileCheck --check-prefix=CHECK-CONST %s +// RUN: %clang_cc1 -std=c++20 -code-completion-at=%s:5:11 %s | FileCheck --check-prefix=CHECK-CONST %s // CHECK-CONST: const // CHECK-CONST: consteval // CHECK-CONST: constexpr // CHECK-CONST: constinit -// RUN: %clang_cc1 -std=c++20 -code-completion-at=%s:5:12 %s | FileCheck --check-prefix=CHECK-CHAR %s +// RUN: %clang_cc1 -std=c++20 -code-completion-at=%s:5:19 %s | FileCheck --check-prefix=CHECK-CHAR %s // CHECK-CHAR: char8_t // RUN: %clang_cc1 -std=c++20 -code-completion-at=%s:8:3 %s | FileCheck --check-prefix=CHECK-CONSTRAINT %s