@@ -1078,19 +1078,23 @@ static bool CheckFunctionConstraintsWithoutInstantiation(
10781078 // template. We need the entire list, since the constraint is completely
10791079 // uninstantiated at this point.
10801080
1081- // getTemplateInstantiationArgs uses this instantiation context to find out
1082- // template arguments for uninstantiated functions.
1083- std::optional<Sema::InstantiatingTemplate> Inst (
1084- std::in_place, SemaRef, PointOfInstantiation,
1085- Sema::InstantiatingTemplate::ConstraintsCheck{}, Template, TemplateArgs,
1086- PointOfInstantiation);
1087- if (Inst->isInvalid ())
1088- return true ;
1089- MultiLevelTemplateArgumentList MLTAL = SemaRef.getTemplateInstantiationArgs (
1090- /* D=*/ FD, FD,
1091- /* Final=*/ false , /* Innermost=*/ {}, /* RelativeToPrimary=*/ true ,
1092- /* Pattern=*/ nullptr , /* ForConstraintInstantiation=*/ true );
1093- Inst = std::nullopt ;
1081+ MultiLevelTemplateArgumentList MLTAL;
1082+ {
1083+ // getTemplateInstantiationArgs uses this instantiation context to find out
1084+ // template arguments for uninstantiated functions.
1085+ // We don't want this RAII object to persist, because there would be
1086+ // otherwise duplicate diagnostic notes.
1087+ Sema::InstantiatingTemplate Inst (
1088+ SemaRef, PointOfInstantiation,
1089+ Sema::InstantiatingTemplate::ConstraintsCheck{}, Template, TemplateArgs,
1090+ PointOfInstantiation);
1091+ if (Inst.isInvalid ())
1092+ return true ;
1093+ MLTAL = SemaRef.getTemplateInstantiationArgs (
1094+ /* D=*/ FD, FD,
1095+ /* Final=*/ false , /* Innermost=*/ {}, /* RelativeToPrimary=*/ true ,
1096+ /* Pattern=*/ nullptr , /* ForConstraintInstantiation=*/ true );
1097+ }
10941098
10951099 Sema::ContextRAII SavedContext (SemaRef, FD);
10961100 std::optional<Sema::CXXThisScopeRAII> ThisScope;
0 commit comments