================
@@ -6930,17 +6934,20 @@ ExprResult 
Sema::CheckTemplateArgument(NonTypeTemplateParmDecl *Param,
     IsConvertedConstantExpression = false;
   }
 
-  if (getLangOpts().CPlusPlus17) {
+  if (getLangOpts().CPlusPlus17 || PartialOrderingTTP) {
     // C++17 [temp.arg.nontype]p1:
     //   A template-argument for a non-type template parameter shall be
     //   a converted constant expression of the type of the template-parameter.
     APValue Value;
     ExprResult ArgResult;
     if (IsConvertedConstantExpression) {
-      ArgResult = BuildConvertedConstantExpression(Arg, ParamType,
-                                                   CCEK_TemplateArg, Param);
-      if (ArgResult.isInvalid())
+      ArgResult = BuildConvertedConstantExpression(
+          Arg, ParamType,
+          PartialOrderingTTP ? CCEK_InjectedTTP : CCEK_TemplateArg, Param);
+      if (ArgResult.isInvalid()) {
----------------
mizvekov wrote:

I don't think any of the Build*/Act* functions return uninitialized ExprResult. 
I see that it's rarely used at all, some functions return it to mean "some 
unknown expression" due to dependence, but that's happening more in other parts 
of the code base, like the concepts implementation.

Maybe we should split these users of ExprResult into ExprResultOrNone, and make 
ExprResult always initialized.

https://github.com/llvm/llvm-project/pull/124313
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to