@@ -1836,6 +1836,9 @@ static void AddTypeSpecifierResults(const LangOptions &LangOpts,
1836
1836
Builder.AddChunk (CodeCompletionString::CK_RightParen);
1837
1837
Results.AddResult (Result (Builder.TakeString ()));
1838
1838
}
1839
+
1840
+ if (LangOpts.Char8 || LangOpts.CPlusPlus20 )
1841
+ Results.AddResult (Result (" char8_t" , CCP_Type));
1839
1842
} else
1840
1843
Results.AddResult (Result (" __auto_type" , CCP_Type));
1841
1844
@@ -1888,6 +1891,9 @@ AddStorageSpecifiers(SemaCodeCompletion::ParserCompletionContext CCC,
1888
1891
Results.AddResult (Result (" constexpr" ));
1889
1892
Results.AddResult (Result (" thread_local" ));
1890
1893
}
1894
+
1895
+ if (LangOpts.CPlusPlus20 )
1896
+ Results.AddResult (Result (" constinit" ));
1891
1897
}
1892
1898
1893
1899
static void
@@ -1911,6 +1917,9 @@ AddFunctionSpecifiers(SemaCodeCompletion::ParserCompletionContext CCC,
1911
1917
case SemaCodeCompletion::PCC_Template:
1912
1918
if (LangOpts.CPlusPlus || LangOpts.C99 )
1913
1919
Results.AddResult (Result (" inline" ));
1920
+
1921
+ if (LangOpts.CPlusPlus20 )
1922
+ Results.AddResult (Result (" consteval" ));
1914
1923
break ;
1915
1924
1916
1925
case SemaCodeCompletion::PCC_ObjCInstanceVariableList:
@@ -2186,6 +2195,69 @@ AddOrdinaryNameResults(SemaCodeCompletion::ParserCompletionContext CCC,
2186
2195
} else {
2187
2196
Results.AddResult (Result (" template" , CodeCompletionResult::RK_Keyword));
2188
2197
}
2198
+
2199
+ if (SemaRef.getLangOpts ().CPlusPlus20 &&
2200
+ SemaRef.getLangOpts ().CPlusPlusModules ) {
2201
+ clang::Module *CurrentModule = SemaRef.getCurrentModule ();
2202
+ if (SemaRef.CurContext ->isTranslationUnit ()) {
2203
+ // / Global module fragment can only be declared in the beginning of
2204
+ // / the file. CurrentModule should be null in this case.
2205
+ if (!CurrentModule) {
2206
+ // module;
2207
+ Builder.AddTypedTextChunk (" module" );
2208
+ Builder.AddChunk (CodeCompletionString::CK_SemiColon);
2209
+ Builder.AddChunk (CodeCompletionString::CK_VerticalSpace);
2210
+ Results.AddResult (Result (Builder.TakeString ()));
2211
+ }
2212
+
2213
+ // / Named module should be declared in the beginning of the file,
2214
+ // / or after the global module fragment.
2215
+ if (!CurrentModule ||
2216
+ CurrentModule->Kind == Module::ExplicitGlobalModuleFragment ||
2217
+ CurrentModule->Kind == Module::ImplicitGlobalModuleFragment) {
2218
+ // export module;
2219
+ // module name;
2220
+ Builder.AddTypedTextChunk (" module" );
2221
+ Builder.AddChunk (CodeCompletionString::CK_HorizontalSpace);
2222
+ Builder.AddPlaceholderChunk (" name" );
2223
+ Builder.AddChunk (CodeCompletionString::CK_SemiColon);
2224
+ Builder.AddChunk (CodeCompletionString::CK_VerticalSpace);
2225
+ Results.AddResult (Result (Builder.TakeString ()));
2226
+ }
2227
+
2228
+ // / Import can occur in non module file or after the named module
2229
+ // / declaration.
2230
+ if (!CurrentModule ||
2231
+ CurrentModule->Kind == Module::ModuleInterfaceUnit ||
2232
+ CurrentModule->Kind == Module::ModulePartitionInterface) {
2233
+ // import name;
2234
+ Builder.AddTypedTextChunk (" import" );
2235
+ Builder.AddChunk (CodeCompletionString::CK_HorizontalSpace);
2236
+ Builder.AddPlaceholderChunk (" name" );
2237
+ Builder.AddChunk (CodeCompletionString::CK_SemiColon);
2238
+ Builder.AddChunk (CodeCompletionString::CK_VerticalSpace);
2239
+ Results.AddResult (Result (Builder.TakeString ()));
2240
+ }
2241
+
2242
+ if (CurrentModule &&
2243
+ (CurrentModule->Kind == Module::ModuleInterfaceUnit ||
2244
+ CurrentModule->Kind == Module::ModulePartitionInterface)) {
2245
+ // module: private;
2246
+ Builder.AddTypedTextChunk (" module" );
2247
+ Builder.AddChunk (CodeCompletionString::CK_Colon);
2248
+ Builder.AddChunk (CodeCompletionString::CK_HorizontalSpace);
2249
+ Builder.AddTypedTextChunk (" private" );
2250
+ Builder.AddChunk (CodeCompletionString::CK_SemiColon);
2251
+ Builder.AddChunk (CodeCompletionString::CK_VerticalSpace);
2252
+ Results.AddResult (Result (Builder.TakeString ()));
2253
+ }
2254
+ }
2255
+
2256
+ // export
2257
+ if (!CurrentModule ||
2258
+ CurrentModule->Kind != Module::ModuleKind::PrivateModuleFragment)
2259
+ Results.AddResult (Result (" export" , CodeCompletionResult::RK_Keyword));
2260
+ }
2189
2261
}
2190
2262
2191
2263
if (SemaRef.getLangOpts ().ObjC )
@@ -2253,6 +2325,11 @@ AddOrdinaryNameResults(SemaCodeCompletion::ParserCompletionContext CCC,
2253
2325
[[fallthrough]];
2254
2326
2255
2327
case SemaCodeCompletion::PCC_Template:
2328
+ if (SemaRef.getLangOpts ().CPlusPlus20 &&
2329
+ CCC == SemaCodeCompletion::PCC_Template)
2330
+ Results.AddResult (Result (" concept" , CCP_Keyword));
2331
+ [[fallthrough]];
2332
+
2256
2333
case SemaCodeCompletion::PCC_MemberTemplate:
2257
2334
if (SemaRef.getLangOpts ().CPlusPlus && Results.includeCodePatterns ()) {
2258
2335
// template < parameters >
@@ -2265,6 +2342,11 @@ AddOrdinaryNameResults(SemaCodeCompletion::ParserCompletionContext CCC,
2265
2342
Results.AddResult (Result (" template" , CodeCompletionResult::RK_Keyword));
2266
2343
}
2267
2344
2345
+ if (SemaRef.getLangOpts ().CPlusPlus20 &&
2346
+ (CCC == SemaCodeCompletion::PCC_Template ||
2347
+ CCC == SemaCodeCompletion::PCC_MemberTemplate))
2348
+ Results.AddResult (Result (" requires" , CCP_Keyword));
2349
+
2268
2350
AddStorageSpecifiers (CCC, SemaRef.getLangOpts (), Results);
2269
2351
AddFunctionSpecifiers (CCC, SemaRef.getLangOpts (), Results);
2270
2352
break ;
@@ -2486,6 +2568,14 @@ AddOrdinaryNameResults(SemaCodeCompletion::ParserCompletionContext CCC,
2486
2568
Builder.AddPlaceholderChunk (" expression" );
2487
2569
Builder.AddChunk (CodeCompletionString::CK_SemiColon);
2488
2570
Results.AddResult (Result (Builder.TakeString ()));
2571
+ // "co_return expression ;" for coroutines(C++20).
2572
+ if (SemaRef.getLangOpts ().CPlusPlus20 ) {
2573
+ Builder.AddTypedTextChunk (" co_return" );
2574
+ Builder.AddChunk (CodeCompletionString::CK_HorizontalSpace);
2575
+ Builder.AddPlaceholderChunk (" expression" );
2576
+ Builder.AddChunk (CodeCompletionString::CK_SemiColon);
2577
+ Results.AddResult (Result (Builder.TakeString ()));
2578
+ }
2489
2579
// When boolean, also add 'return true;' and 'return false;'.
2490
2580
if (ReturnType->isBooleanType ()) {
2491
2581
Builder.AddTypedTextChunk (" return true" );
@@ -2706,6 +2796,44 @@ AddOrdinaryNameResults(SemaCodeCompletion::ParserCompletionContext CCC,
2706
2796
Builder.AddChunk (CodeCompletionString::CK_RightParen);
2707
2797
Results.AddResult (Result (Builder.TakeString ()));
2708
2798
}
2799
+
2800
+ if (SemaRef.getLangOpts ().CPlusPlus20 ) {
2801
+ // co_await expression
2802
+ Builder.AddTypedTextChunk (" co_await" );
2803
+ Builder.AddChunk (CodeCompletionString::CK_HorizontalSpace);
2804
+ Builder.AddPlaceholderChunk (" expression" );
2805
+ Results.AddResult (Result (Builder.TakeString ()));
2806
+
2807
+ // co_yield expression
2808
+ Builder.AddTypedTextChunk (" co_yield" );
2809
+ Builder.AddChunk (CodeCompletionString::CK_HorizontalSpace);
2810
+ Builder.AddPlaceholderChunk (" expression" );
2811
+ Results.AddResult (Result (Builder.TakeString ()));
2812
+
2813
+ // requires (parameters) { requirements }
2814
+ Builder.AddResultTypeChunk (" bool" );
2815
+ Builder.AddTypedTextChunk (" requires" );
2816
+ Builder.AddChunk (CodeCompletionString::CK_HorizontalSpace);
2817
+ Builder.AddChunk (CodeCompletionString::CK_LeftParen);
2818
+ Builder.AddPlaceholderChunk (" parameters" );
2819
+ Builder.AddChunk (CodeCompletionString::CK_RightParen);
2820
+ Builder.AddChunk (CodeCompletionString::CK_HorizontalSpace);
2821
+ Builder.AddChunk (CodeCompletionString::CK_LeftBrace);
2822
+ Builder.AddChunk (CodeCompletionString::CK_VerticalSpace);
2823
+ Builder.AddPlaceholderChunk (" requirements" );
2824
+ Builder.AddChunk (CodeCompletionString::CK_VerticalSpace);
2825
+ Builder.AddChunk (CodeCompletionString::CK_RightBrace);
2826
+ Results.AddResult (Result (Builder.TakeString ()));
2827
+
2828
+ if (SemaRef.CurContext ->isRequiresExprBody ()) {
2829
+ // requires expression ;
2830
+ Builder.AddTypedTextChunk (" requires" );
2831
+ Builder.AddChunk (CodeCompletionString::CK_HorizontalSpace);
2832
+ Builder.AddPlaceholderChunk (" expression" );
2833
+ Builder.AddChunk (CodeCompletionString::CK_SemiColon);
2834
+ Results.AddResult (Result (Builder.TakeString ()));
2835
+ }
2836
+ }
2709
2837
}
2710
2838
2711
2839
if (SemaRef.getLangOpts ().ObjC ) {
0 commit comments