Нет специализации шаблона в clang AST, если отсутствует заголовок
Наблюдение: Clang AST не содержит какой-либо специализации шаблона, если отсутствует заголовочный файл. Это верно даже тогда, когда шаблон не имеет ничего общего с заголовочным файлом.
Например,
#include "unknown_header.h"
template<class T>
T add(T x, T y) {return x + y;}
void sum(void)
{
add<double>(5.0, 6.0);
}
генерироватьFunctionTemplateDecl
экземпляр, который не содержит специализации для типаdouble
.
Но если мы избавимся от «unknown_header.h», что приведет к успешной компиляции, мы сможем увидеть специализацию с использованием типа double. Специализацию можно увидеть ниже после удаления заголовка.
|-FunctionTemplateDecl 0x55ec327d83e8 <tmp.cpp:1:1, line:2:31> col:3 add
| |-TemplateTypeParmDecl 0x55ec327d80f0 <line:1:10, col:16> col:16 referenced class depth 0 index 0 T
| |-FunctionDecl 0x55ec327d8348 <line:2:1, col:31> col:3 add 'T (T, T)'
| | |-ParmVarDecl 0x55ec327d81c0 <col:7, col:9> col:9 referenced x 'T'
| | |-ParmVarDecl 0x55ec327d8238 <col:12, col:14> col:14 referenced y 'T'
| | `-CompoundStmt 0x55ec327d8580 <col:17, col:31>
| | `-ReturnStmt 0x55ec327d8570 <col:18, col:29>
| | `-BinaryOperator 0x55ec327d8550 <col:25, col:29> '<dependent type>' '+'
| | |-DeclRefExpr 0x55ec327d8510 <col:25> 'T' lvalue ParmVar 0x55ec327d81c0 'x' 'T'
| | `-DeclRefExpr 0x55ec327d8530 <col:29> 'T' lvalue ParmVar 0x55ec327d8238 'y' 'T'
| `-FunctionDecl 0x55ec327d8ae8 <col:1, col:31> col:3 used add 'double (double, double)'
| |-TemplateArgument type 'double'
| | `-BuiltinType 0x55ec327923c0 'double'
| |-ParmVarDecl 0x55ec327d8960 <col:7, col:9> col:9 used x 'double':'double'
| |-ParmVarDecl 0x55ec327d89d8 <col:12, col:14> col:14 used y 'double':'double'
| `-CompoundStmt 0x55ec327d8da8 <col:17, col:31>
| `-ReturnStmt 0x55ec327d8d98 <col:18, col:29>
| `-BinaryOperator 0x55ec327d8d78 <col:25, col:29> 'double' '+'
| |-ImplicitCastExpr 0x55ec327d8d48 <col:25> 'double':'double' <LValueToRValue>
| | `-DeclRefExpr 0x55ec327d8d08 <col:25> 'double':'double' lvalue ParmVar 0x55ec327d8960 'x' 'double':'double'
| `-ImplicitCastExpr 0x55ec327d8d60 <col:29> 'double':'double' <LValueToRValue>
| `-DeclRefExpr 0x55ec327d8d28 <col:29> 'double':'double' lvalue ParmVar 0x55ec327d89d8 'y' 'double':'double'
Вопрос: Что мешает clang сгенерировать специализацию шаблона, если заголовок отсутствует?