C++: Only support non-type template parameters in tail position.

This commit is contained in:
Mathias Vorreiter Pedersen
2025-11-25 14:54:47 +00:00
parent faa55f50e7
commit 05737af165

View File

@@ -634,14 +634,13 @@ string getParameterTypeWithoutTemplateArguments(Function f, int n, boolean canon
canonical = true canonical = true
} }
/** Gets the `i`'th supported template parameter for `templateFunction`. */ /**
private Locatable getSupportedFunctionTemplateArgument(Function templateFunction, int i) { * Gets the largest index of a template parameter of `templateFunction` that
* is a type template parameter.
*/
private int getLastTypeTemplateFunctionParameterIndex(Function templateFunction) {
result = result =
rank[i + 1](int j, TypeTemplateParameter ttp | max(int index | templateFunction.getTemplateArgument(index) instanceof TypeTemplateParameter)
ttp = templateFunction.getTemplateArgument(j)
|
ttp order by j
)
} }
/** Gets the number of supported template parameters for `templateFunction`. */ /** Gets the number of supported template parameters for `templateFunction`. */
@@ -649,6 +648,14 @@ private int getNumberOfSupportedFunctionTemplateArguments(Function templateFunct
result = count(int i | exists(getSupportedFunctionTemplateArgument(templateFunction, i)) | i) result = count(int i | exists(getSupportedFunctionTemplateArgument(templateFunction, i)) | i)
} }
/** Gets the `i`'th supported template parameter for `templateFunction`. */
private Locatable getSupportedFunctionTemplateArgument(Function templateFunction, int i) {
result = templateFunction.getTemplateArgument(i) and
// We don't yet support non-type template parameters in the middle of a
// template parameter list
i <= getLastTypeTemplateFunctionParameterIndex(templateFunction)
}
/** /**
* Normalize the `n`'th parameter of `f` by replacing template names * Normalize the `n`'th parameter of `f` by replacing template names
* with `func:N` (where `N` is the index of the template). * with `func:N` (where `N` is the index of the template).
@@ -669,14 +676,21 @@ private string getTypeNameWithoutFunctionTemplates(Function f, int n, int remain
) )
} }
/**
* Gets the largest index of a template parameter of `templateFunction` that
* is a type template parameter.
*/
private int getLastTypeTemplateClassParameterIndex(Class templateClass) {
result =
max(int index | templateClass.getTemplateArgument(index) instanceof TypeTemplateParameter)
}
/** Gets the `i`'th supported template parameter for `templateClass`. */ /** Gets the `i`'th supported template parameter for `templateClass`. */
private Locatable getSupportedClassTemplateArgument(Class templateClass, int i) { private Locatable getSupportedClassTemplateArgument(Class templateClass, int i) {
result = result = templateClass.getTemplateArgument(i) and
rank[i + 1](int j, TypeTemplateParameter ttp | // We don't yet support non-type template parameters in the middle of a
ttp = templateClass.getTemplateArgument(j) // template parameter list
| i <= getLastTypeTemplateClassParameterIndex(templateClass)
ttp order by j
)
} }
/** Gets the number of supported template parameters for `templateClass`. */ /** Gets the number of supported template parameters for `templateClass`. */