[clang] [clang] disallow narrowing when matching template template parameters (PR #124313)
Matheus Izvekov via cfe-commits
cfe-commits at lists.llvm.org
Fri Jan 24 12:43:25 PST 2025
================
@@ -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
More information about the cfe-commits
mailing list