File tree Expand file tree Collapse file tree 3 files changed +33
-18
lines changed Expand file tree Collapse file tree 3 files changed +33
-18
lines changed Original file line number Diff line number Diff line change @@ -299,6 +299,8 @@ impl<'ctx> BindgenContext<'ctx> {
299
299
let id = item. id ( ) ;
300
300
let is_type = item. kind ( ) . is_type ( ) ;
301
301
let is_unnamed = is_type && item. expect_type ( ) . name ( ) . is_none ( ) ;
302
+ let is_template_instantiation =
303
+ is_type && item. expect_type ( ) . is_template_instantiation ( ) ;
302
304
303
305
// Be sure to track all the generated children under namespace, even
304
306
// those generated after resolving typerefs, etc.
@@ -317,7 +319,7 @@ impl<'ctx> BindgenContext<'ctx> {
317
319
// Unnamed items can have an USR, but they can't be referenced from
318
320
// other sites explicitly and the USR can match if the unnamed items are
319
321
// nested, so don't bother tracking them.
320
- if is_type && declaration. is_some ( ) {
322
+ if is_type && !is_template_instantiation && declaration. is_some ( ) {
321
323
let mut declaration = declaration. unwrap ( ) ;
322
324
if !declaration. is_valid ( ) {
323
325
if let Some ( location) = location {
Original file line number Diff line number Diff line change @@ -251,25 +251,30 @@ impl TemplateInstantiation {
251
251
}
252
252
} ) ;
253
253
254
- let definition = ty. declaration ( )
255
- . specialized ( )
256
- . or_else ( || {
257
- let mut template_ref = None ;
258
- ty. declaration ( ) . visit ( |child| {
259
- if child. kind ( ) == CXCursor_TemplateRef {
260
- template_ref = Some ( child) ;
261
- return CXVisit_Break ;
262
- }
254
+ let declaration = ty. declaration ( ) ;
255
+ let definition = if declaration. kind ( ) == CXCursor_TypeAliasTemplateDecl {
256
+ Some ( declaration)
257
+ } else {
258
+ declaration
259
+ . specialized ( )
260
+ . or_else ( || {
261
+ let mut template_ref = None ;
262
+ ty. declaration ( ) . visit ( |child| {
263
+ if child. kind ( ) == CXCursor_TemplateRef {
264
+ template_ref = Some ( child) ;
265
+ return CXVisit_Break ;
266
+ }
263
267
264
- // Instantiations of template aliases might have the
265
- // TemplateRef to the template alias definition arbitrarily
266
- // deep, so we need to recurse here and not only visit
267
- // direct children.
268
- CXChildVisit_Recurse
269
- } ) ;
268
+ // Instantiations of template aliases might have the
269
+ // TemplateRef to the template alias definition arbitrarily
270
+ // deep, so we need to recurse here and not only visit
271
+ // direct children.
272
+ CXChildVisit_Recurse
273
+ } ) ;
270
274
271
- template_ref. and_then ( |cur| cur. referenced ( ) )
272
- } ) ;
275
+ template_ref. and_then ( |cur| cur. referenced ( ) )
276
+ } )
277
+ } ;
273
278
274
279
let definition = match definition {
275
280
Some ( def) => def,
Original file line number Diff line number Diff line change @@ -109,6 +109,14 @@ impl Type {
109
109
}
110
110
}
111
111
112
+ /// Is this a template instantiation type?
113
+ pub fn is_template_instantiation ( & self ) -> bool {
114
+ match self . kind {
115
+ TypeKind :: TemplateInstantiation ( ..) => true ,
116
+ _ => false ,
117
+ }
118
+ }
119
+
112
120
/// Is this a template alias type?
113
121
pub fn is_template_alias ( & self ) -> bool {
114
122
match self . kind {
You can’t perform that action at this time.
0 commit comments