================
@@ -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
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits