1212
1313namespace Carbon ::Check {
1414
15- // Explicit or implicit parameters. Used in diagnostics.
16- enum class ParamKind : uint8_t {
17- Explicit,
18- Implicit,
19- };
20-
21- } // namespace Carbon::Check
22-
23- // `ParamKind` is formatted in diagnostics as `{0}parameters`, and we only add
24- // text for implicit paramseters.
25- template <>
26- struct llvm ::format_provider<Carbon::Check::ParamKind> {
27- using ParamKind = Carbon::Check::ParamKind;
28- static void format (const ParamKind& kind, raw_ostream& out,
29- StringRef /* style*/ ) {
30- if (kind == ParamKind::Implicit) {
31- out << " implicit " ;
32- }
33- }
34- };
35-
36- namespace Carbon ::Check {
37-
3815CARBON_DIAGNOSTIC (RedeclPrevDecl, Note, " previously declared here" );
3916
4017// Diagnoses a redeclaration which is redundant.
@@ -217,7 +194,7 @@ static auto EntityHasParamError(Context& context, const DeclParams& info)
217194
218195// Returns false if a param differs for a redeclaration. The caller is expected
219196// to provide a diagnostic.
220- static auto CheckRedeclParam (Context& context, ParamKind param_kind ,
197+ static auto CheckRedeclParam (Context& context, bool is_implicit_param ,
221198 int32_t param_index,
222199 SemIR::InstId new_param_pattern_id,
223200 SemIR::InstId prev_param_pattern_id,
@@ -231,15 +208,16 @@ static auto CheckRedeclParam(Context& context, ParamKind param_kind,
231208 return ;
232209 }
233210 CARBON_DIAGNOSTIC (RedeclParamDiffers, Error,
234- " redeclaration differs at {0}parameter {1}" , ParamKind,
235- int32_t );
236- CARBON_DIAGNOSTIC (RedeclParamPrevious, Note,
237- " previous declaration's corresponding {0}parameter here" ,
238- ParamKind);
211+ " redeclaration differs at {0:implicit |}parameter {1}" ,
212+ BoolAsSelect, int32_t );
213+ CARBON_DIAGNOSTIC (
214+ RedeclParamPrevious, Note,
215+ " previous declaration's corresponding {0:implicit |}parameter here" ,
216+ BoolAsSelect);
239217 context.emitter ()
240- .Build (new_param_pattern_id, RedeclParamDiffers, param_kind ,
218+ .Build (new_param_pattern_id, RedeclParamDiffers, is_implicit_param ,
241219 param_index + 1 )
242- .Note (prev_param_pattern_id, RedeclParamPrevious, param_kind )
220+ .Note (prev_param_pattern_id, RedeclParamPrevious, is_implicit_param )
243221 .Emit ();
244222 };
245223
@@ -291,7 +269,7 @@ static auto CheckRedeclParams(Context& context, SemIRLoc new_decl_loc,
291269 SemIR::InstBlockId new_param_patterns_id,
292270 SemIRLoc prev_decl_loc,
293271 SemIR::InstBlockId prev_param_patterns_id,
294- ParamKind param_kind ,
272+ bool is_implicit_param ,
295273 SemIR::SpecificId prev_specific_id, bool diagnose)
296274 -> bool {
297275 // This will often occur for empty params.
@@ -304,18 +282,19 @@ static auto CheckRedeclParams(Context& context, SemIRLoc new_decl_loc,
304282 if (!diagnose) {
305283 return false ;
306284 }
307- CARBON_DIAGNOSTIC (
308- RedeclParamListDiffers, Error,
309- " redeclaration differs because of {1:'|missing '}{0}parameter list" ,
310- ParamKind, FormatBool );
285+ CARBON_DIAGNOSTIC (RedeclParamListDiffers, Error,
286+ " redeclaration differs because of "
287+ " {1:'|missing '}{0:implicit | }parameter list" ,
288+ BoolAsSelect, BoolAsSelect );
311289 CARBON_DIAGNOSTIC (RedeclParamListPrevious, Note,
312- " previously declared {1:with|without} {0}parameter list" ,
313- ParamKind, FormatBool);
290+ " previously declared "
291+ " {1:with|without} {0:implicit |}parameter list" ,
292+ BoolAsSelect, BoolAsSelect);
314293 context.emitter ()
315- .Build (new_decl_loc, RedeclParamListDiffers, param_kind ,
316- {. value = new_param_patterns_id.is_valid ()} )
317- .Note (prev_decl_loc, RedeclParamListPrevious, param_kind ,
318- {. value = prev_param_patterns_id.is_valid ()} )
294+ .Build (new_decl_loc, RedeclParamListDiffers, is_implicit_param ,
295+ new_param_patterns_id.is_valid ())
296+ .Note (prev_decl_loc, RedeclParamListPrevious, is_implicit_param ,
297+ prev_param_patterns_id.is_valid ())
319298 .Emit ();
320299 return false ;
321300 }
@@ -332,23 +311,25 @@ static auto CheckRedeclParams(Context& context, SemIRLoc new_decl_loc,
332311 }
333312 CARBON_DIAGNOSTIC (
334313 RedeclParamCountDiffers, Error,
335- " redeclaration differs because of {0}parameter count of {1}" , ParamKind,
336- int32_t );
337- CARBON_DIAGNOSTIC (RedeclParamCountPrevious, Note,
338- " previously declared with {0}parameter count of {1}" ,
339- ParamKind, int32_t );
314+ " redeclaration differs because of {0:implicit |}parameter count of {1}" ,
315+ BoolAsSelect, int32_t );
316+ CARBON_DIAGNOSTIC (
317+ RedeclParamCountPrevious, Note,
318+ " previously declared with {0:implicit |}parameter count of {1}" ,
319+ BoolAsSelect, int32_t );
340320 context.emitter ()
341- .Build (new_decl_loc, RedeclParamCountDiffers, param_kind ,
321+ .Build (new_decl_loc, RedeclParamCountDiffers, is_implicit_param ,
342322 new_param_pattern_ids.size ())
343- .Note (prev_decl_loc, RedeclParamCountPrevious, param_kind ,
323+ .Note (prev_decl_loc, RedeclParamCountPrevious, is_implicit_param ,
344324 prev_param_pattern_ids.size ())
345325 .Emit ();
346326 return false ;
347327 }
348328 for (auto [index, new_param_pattern_id, prev_param_pattern_id] :
349329 llvm::enumerate (new_param_pattern_ids, prev_param_pattern_ids)) {
350- if (!CheckRedeclParam (context, param_kind, index, new_param_pattern_id,
351- prev_param_pattern_id, prev_specific_id, diagnose)) {
330+ if (!CheckRedeclParam (context, is_implicit_param, index,
331+ new_param_pattern_id, prev_param_pattern_id,
332+ prev_specific_id, diagnose)) {
352333 return false ;
353334 }
354335 }
@@ -434,15 +415,16 @@ auto CheckRedeclParamsMatch(Context& context, const DeclParams& new_entity,
434415 EntityHasParamError (context, prev_entity)) {
435416 return false ;
436417 }
437- if (!CheckRedeclParams (context, new_entity. loc ,
438- new_entity.implicit_param_patterns_id , prev_entity. loc ,
439- prev_entity.implicit_param_patterns_id ,
440- ParamKind::Implicit , prev_specific_id, diagnose)) {
418+ if (!CheckRedeclParams (
419+ context, new_entity.loc , new_entity. implicit_param_patterns_id ,
420+ prev_entity. loc , prev_entity.implicit_param_patterns_id ,
421+ /* is_implicit_param= */ true , prev_specific_id, diagnose)) {
441422 return false ;
442423 }
443424 if (!CheckRedeclParams (context, new_entity.loc , new_entity.param_patterns_id ,
444425 prev_entity.loc , prev_entity.param_patterns_id ,
445- ParamKind::Explicit, prev_specific_id, diagnose)) {
426+ /* is_implicit_param=*/ false , prev_specific_id,
427+ diagnose)) {
446428 return false ;
447429 }
448430 if (check_syntax &&
0 commit comments