C++: Introduce a new base class for template parameters

This will enable us to support non-type template parameters, which we
currently do not support, and error template parameters, which might
become relevant in the `build-mode: none` context.
This commit is contained in:
Jeroen Ketema
2024-12-17 16:49:56 +01:00
parent 7ab06fca2f
commit b7d1da8741
18 changed files with 78 additions and 48 deletions

View File

@@ -915,7 +915,7 @@ VacuousDestructorCall.cpp:
# 2| [TemplateFunction,TopLevelFunction] void CallDestructor<T>(T, T*)
# 2| <params>:
# 2| getParameter(0): [Parameter] x
# 2| Type = [TemplateParameter] T
# 2| Type = [TypeTemplateParameter] T
# 2| getParameter(1): [Parameter] y
# 2| Type = [PointerType] T *
# 2| getEntryPoint(): [BlockStmt] { ... }
@@ -927,7 +927,7 @@ VacuousDestructorCall.cpp:
# 3| Type = [UnknownType] unknown
# 3| ValueCategory = prvalue
# 3| getChild(-1): [VariableAccess] x
# 3| Type = [TemplateParameter] T
# 3| Type = [TypeTemplateParameter] T
# 3| ValueCategory = lvalue
# 4| getStmt(1): [ExprStmt] ExprStmt
# 4| getExpr(): [ExprCall] call to expression

View File

@@ -56,7 +56,7 @@ union MyUnion0 {
// Typedef
typedef MyClass0 *MyClassPtr;
// TemplateClass, TemplateParameter (UserType)
// TemplateClass, TypeTemplateParameter (UserType)
template <typename T>
class myTemplateClass
@@ -113,7 +113,7 @@ public:
// Typedef
typedef MyClass1 *MyClassPtr;
// TemplateClass, TemplateParameter (UserType)
// TemplateClass, TypeTemplateParameter (UserType)
template <typename T>
class myTemplateClass

View File

@@ -9016,9 +9016,9 @@ ir.cpp:
# 704| [TemplateFunction,TopLevelFunction] T min<T>(T, T)
# 704| <params>:
# 704| getParameter(0): [Parameter] x
# 704| Type = [TemplateParameter] T
# 704| Type = [TypeTemplateParameter] T
# 704| getParameter(1): [Parameter] y
# 704| Type = [TemplateParameter] T
# 704| Type = [TypeTemplateParameter] T
# 704| getEntryPoint(): [BlockStmt] { ... }
# 705| getStmt(0): [ReturnStmt] return ...
# 705| getExpr(): [ConditionalExpr] ... ? ... : ...
@@ -9028,16 +9028,16 @@ ir.cpp:
# 705| Type = [UnknownType] unknown
# 705| ValueCategory = prvalue
# 705| getLesserOperand(): [VariableAccess] x
# 705| Type = [TemplateParameter] T
# 705| Type = [TypeTemplateParameter] T
# 705| ValueCategory = lvalue
# 705| getGreaterOperand(): [VariableAccess] y
# 705| Type = [TemplateParameter] T
# 705| Type = [TypeTemplateParameter] T
# 705| ValueCategory = lvalue
# 705| getThen(): [VariableAccess] x
# 705| Type = [TemplateParameter] T
# 705| Type = [TypeTemplateParameter] T
# 705| ValueCategory = lvalue
# 705| getElse(): [VariableAccess] y
# 705| Type = [TemplateParameter] T
# 705| Type = [TypeTemplateParameter] T
# 705| ValueCategory = lvalue
# 705| getCondition().getFullyConverted(): [CStyleCast] (bool)...
# 705| Conversion = [BoolConversion] conversion to bool
@@ -9095,24 +9095,24 @@ ir.cpp:
# 715| [MemberFunction,TemplateFunction] T Outer<T>::Func<U, V>(U, V)
# 715| <params>:
# 715| getParameter(0): [Parameter] x
# 715| Type = [TemplateParameter] U
# 715| Type = [TypeTemplateParameter] U
# 715| getParameter(1): [Parameter] y
# 715| Type = [TemplateParameter] V
# 715| Type = [TypeTemplateParameter] V
# 715| getEntryPoint(): [BlockStmt] { ... }
# 716| getStmt(0): [ReturnStmt] return ...
# 716| getExpr(): [Literal] 0
# 716| Type = [TemplateParameter] T
# 716| Type = [TypeTemplateParameter] T
# 716| Value = [Literal] 0
# 716| ValueCategory = prvalue
# 716| getExpr().getFullyConverted(): [TemporaryObjectExpr] temporary object
# 716| Type = [TemplateParameter] T
# 716| Type = [TypeTemplateParameter] T
# 716| ValueCategory = prvalue(load)
# 715| [MemberFunction,TemplateFunction] long Outer<long>::Func<U, V>(U, V)
# 715| <params>:
# 715| getParameter(0): [Parameter] x
# 715| Type = [TemplateParameter] U
# 715| Type = [TypeTemplateParameter] U
# 715| getParameter(1): [Parameter] y
# 715| Type = [TemplateParameter] V
# 715| Type = [TypeTemplateParameter] V
# 715| [FunctionTemplateInstantiation,MemberFunction] long Outer<long>::Func<void*, char>(void*, char)
# 715| <params>:
# 715| getParameter(0): [Parameter] x
@@ -12559,7 +12559,7 @@ ir.cpp:
# 1109| [Constructor] void std::vector<T>::vector(T)
# 1109| <params>:
# 1109| getParameter(0): [Parameter] (unnamed parameter 0)
# 1109| Type = [TemplateParameter] T
# 1109| Type = [TypeTemplateParameter] T
# 1109| [Constructor] void std::vector<char>::vector(char)
# 1109| <params>:
# 1109| getParameter(0): [Parameter] (unnamed parameter 0)
@@ -12601,15 +12601,15 @@ ir.cpp:
# 1120| [Operator,TemplateFunction,TopLevelFunction] bool std::operator==<T>(iterator, iterator)
# 1120| <params>:
# 1120| getParameter(0): [Parameter] left
# 1120| Type = [TemplateParameter] iterator
# 1120| Type = [TypeTemplateParameter] iterator
# 1120| getParameter(1): [Parameter] right
# 1120| Type = [TemplateParameter] iterator
# 1120| Type = [TypeTemplateParameter] iterator
# 1122| [Operator,TemplateFunction,TopLevelFunction] bool std::operator!=<T>(iterator, iterator)
# 1122| <params>:
# 1122| getParameter(0): [Parameter] left
# 1122| Type = [TemplateParameter] iterator
# 1122| Type = [TypeTemplateParameter] iterator
# 1122| getParameter(1): [Parameter] right
# 1122| Type = [TemplateParameter] iterator
# 1122| Type = [TypeTemplateParameter] iterator
# 1126| [TopLevelFunction] void RangeBasedFor(std::vector<int> const&)
# 1126| <params>:
# 1126| getParameter(0): [Parameter] v
@@ -14129,11 +14129,11 @@ ir.cpp:
# 1375| getEntryPoint(): [BlockStmt] { ... }
# 1376| getStmt(0): [ReturnStmt] return ...
# 1376| getExpr(): [Literal] 0
# 1376| Type = [TemplateParameter] T
# 1376| Type = [TypeTemplateParameter] T
# 1376| Value = [Literal] 0
# 1376| ValueCategory = prvalue
# 1376| getExpr().getFullyConverted(): [TemporaryObjectExpr] temporary object
# 1376| Type = [TemplateParameter] T
# 1376| Type = [TypeTemplateParameter] T
# 1376| ValueCategory = prvalue(load)
# 1375| [FunctionTemplateInstantiation,TopLevelFunction] copy_constructor defaultConstruct<copy_constructor>()
# 1375| <params>:
@@ -14223,7 +14223,7 @@ ir.cpp:
# 1409| [TemplateFunction,TopLevelFunction] void acceptValue<T>(T)
# 1409| <params>:
# 1409| getParameter(0): [Parameter] v
# 1409| Type = [TemplateParameter] T
# 1409| Type = [TypeTemplateParameter] T
# 1409| [FunctionTemplateInstantiation,TopLevelFunction] void acceptValue<copy_constructor>(copy_constructor)
# 1409| <params>:
# 1409| getParameter(0): [Parameter] v
@@ -20584,7 +20584,7 @@ ir.cpp:
# 2256| Type = [LValueReferenceType] T &
# 2256| ValueCategory = prvalue(load)
# 2256| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference)
# 2256| Type = [TemplateParameter] T
# 2256| Type = [TypeTemplateParameter] T
# 2256| ValueCategory = lvalue
# 2256| [FunctionTemplateInstantiation,TopLevelFunction] int& vacuous_destructor_call::get<int>(int&)
# 2256| <params>:
@@ -20648,7 +20648,7 @@ ir.cpp:
# 2260| Type = [LValueReferenceType] T &
# 2260| ValueCategory = prvalue(load)
# 2260| getArgument(0).getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference)
# 2260| Type = [TemplateParameter] T
# 2260| Type = [TypeTemplateParameter] T
# 2260| ValueCategory = lvalue
# 2261| getStmt(1): [ReturnStmt] return ...
# 2259| [FunctionTemplateInstantiation,TopLevelFunction] void vacuous_destructor_call::call_destructor<int>(int&)

View File

@@ -1,4 +1,4 @@
| proxy_class.cpp:1:8:1:11 | Base | Struct |
| proxy_class.cpp:3:20:3:20 | T | ProxyClass |
| proxy_class.cpp:3:20:3:20 | T | TemplateParameter |
| proxy_class.cpp:3:20:3:20 | T | TypeTemplateParameter |
| proxy_class.cpp:4:8:4:14 | Derived<Base> | Struct |

View File

@@ -3,7 +3,7 @@ import cpp
string clazz(Declaration d) {
d instanceof ProxyClass and result = "ProxyClass"
or
d instanceof TemplateParameter and result = "TemplateParameter"
d instanceof TypeTemplateParameter and result = "TypeTemplateParameter"
or
d instanceof Struct and result = "Struct"
}