enum A {}; enum B {}; template T var = T(); A a = var; B b = var; // NOTE: libclang before 4.0 doesn't expose template usage on |var|. #if false EnumDecl A EnumDecl B UnexposedDecl var VarDecl a UnexposedExpr var UnexposedExpr var DeclRefExpr var TypeRef enum A UnexposedDecl var VarDecl b UnexposedExpr var UnexposedExpr var DeclRefExpr var TypeRef enum B UnexposedDecl var #endif /* EXTRA_FLAGS: -std=c++14 OUTPUT: { "includes": [], "skipped_by_preprocessor": ["12:1-28:7"], "types": [{ "id": 0, "usr": "c:@E@A", "short_name": "A", "detailed_name": "A", "hover": "A", "definition_spelling": "1:6-1:7", "definition_extent": "1:1-1:10", "parents": [], "derived": [], "types": [], "funcs": [], "vars": [], "instances": [1], "uses": ["1:6-1:7", "7:1-7:2", "7:11-7:12"] }, { "id": 1, "usr": "c:@E@B", "short_name": "B", "detailed_name": "B", "hover": "B", "definition_spelling": "2:6-2:7", "definition_extent": "2:1-2:10", "parents": [], "derived": [], "types": [], "funcs": [], "vars": [], "instances": [2], "uses": ["2:6-2:7", "8:1-8:2", "8:11-8:12"] }, { "id": 2, "usr": "c:template_var_usage_folded_into_one.cc@35", "short_name": "", "detailed_name": "", "hover": "", "parents": [], "derived": [], "types": [], "funcs": [], "vars": [], "instances": [], "uses": ["5:1-5:2", "5:9-5:10"] }], "funcs": [], "vars": [{ "id": 0, "usr": "c:@VT>1#T@var", "short_name": "var", "detailed_name": "T var", "hover": "T", "definition_spelling": "5:3-5:6", "definition_extent": "5:1-5:12", "is_local": false, "is_macro": false, "uses": ["5:3-5:6", "7:7-7:10", "8:7-8:10"] }, { "id": 1, "usr": "c:@a", "short_name": "a", "detailed_name": "A a", "hover": "A", "definition_spelling": "7:3-7:4", "definition_extent": "7:1-7:13", "variable_type": 0, "is_local": false, "is_macro": false, "uses": ["7:3-7:4"] }, { "id": 2, "usr": "c:@b", "short_name": "b", "detailed_name": "B b", "hover": "B", "definition_spelling": "8:3-8:4", "definition_extent": "8:1-8:13", "variable_type": 1, "is_local": false, "is_macro": false, "uses": ["8:3-8:4"] }] } */