[cfe-dev] Get template parameter for Type

Frank Redeker via cfe-dev cfe-dev at lists.llvm.org
Fri Apr 13 12:57:11 PDT 2018


Hello List,

Given the following AST

ClassTemplateDecl 0x3fc1dd0 <.idbbuild/debug.c:13:1, line:20:1> line:13:43 T
|-TemplateTypeParmDecl 0x3f220c8 <col:11, col:20> col:20 referenced
typename depth 0 index 0 P1
|-TemplateTypeParmDecl 0x3f22168 <col:24, col:33> col:33 referenced
typename depth 0 index 1 P2
|-CXXRecordDecl 0x3fc1d30 <col:37, line:20:1> line:13:43 class T definition
...
| |-CXXMethodDecl 0x3fc2280 <line:15:2, col:15> col:5 Method 'P1 (P2)'
| | `-ParmVarDecl 0x3fc2148 <col:13> col:15 'P2'
| |-CXXRecordDecl 0x3fc2330 <line:16:2, line:19:2> line:16:2 struct
definition
...
| | |-FieldDecl 0x3fc2468 <line:17:3, col:6> col:6 M1 'P1'
| | `-FieldDecl 0x3fc24c8 <line:18:3, col:6> col:6 M2 'P2'
| `-FieldDecl 0x3fc2590 <line:16:2, line:19:4> col:4 M 'struct
(anonymous struct at .idbbuild/debug.c:16:2)':'T::(anonymous struct at
.idbbuild/debug.c:16:2)'
`-ClassTemplateSpecializationDecl 0x3fc2640 <line:13:1, line:20:1>
line:13:43 class T definition
  |-TemplateArgument type 'int'
  |-TemplateArgument type 'char'
  ...
  |-CXXMethodDecl 0x3fc2bb0 <line:15:2, col:15> col:5 Method 'int (char)'
  | `-ParmVarDecl 0x3fc2aa8 <col:13> col:15 'char':'char'
  |-CXXRecordDecl 0x3fc2c70 <line:16:2, line:19:2> line:16:2 struct
definition
  ...
  | |-FieldDecl 0x3fc3e28 <line:17:3, col:6> col:6 referenced M1 'int':'int'
  | |-FieldDecl 0x3fc3e88 <line:18:3, col:6> col:6 M2 'char':'char'
  ...


Is it possible to get the TemplateArgument (or even better the
TemplateTypeParmDecl) when visiting a FieldDecl or ParmVarDecl inside a
ClassTemplateSpecializationDecl.

FieldDecl * f; <-- FieldDecl 0x3fc3e28 in AST
Type *      t = f->getType()->split().Ty;

And now for this Type t find the TemplateArgument or TemplateTypeParmDecl


Frank



More information about the cfe-dev mailing list