[cfe-dev] Extent for templated functions seems off

Johannes Altmanninger via cfe-dev cfe-dev at lists.llvm.org
Mon Sep 25 16:28:26 PDT 2017


Jared Grubb via cfe-dev <cfe-dev at lists.llvm.org> writes:

> I'm trying to use libclang to extract some code, and I hit a case that is really irking me.
>
> Look at the Foo::foo definition on lines 7 through 11:
>
>      1	template <typename ClassType>
>      2	struct Foo {
>      3	    template <typename T>
>      4	    int foo();
>      5	};
>      6
>      7	template <typename ClassType>
>      8	template <typename T>
>      9	int Foo<ClassType>::foo() {
>     10	    return 42;
>     11	}
>     
> The reported extent of the definition FunctionTemplateDecl is lines 8 to 11, when I was expecting it to start at line 7. Therefore, when I use that extent in order to extract the function definition, it leaves behind the class template line on line 7.
>
> Note that when you look the second child element, the CXXMethodDecl, that one has the full extent from lines 7 to 11, which is what I really want.
>
> Is this a bug? It seems odd that the children would have an extent not
> strictly inside the parent element.

I think it's a bug, I am not sure how to fix it though.

>
> If this is not a bug, what's the best way to find the full extent of the entire definition? I tried a hack to use the min/max extent of the node and its children, but libclang does not happen to return that child.
>
> Thanks!
> Jared
>
> ===== clang AST dump =====
>
> |-ClassTemplateDecl 0x7fa70d058da8 <temp.cpp:1:1, line:5:1> line:2:8 Foo
> | |-TemplateTypeParmDecl 0x7fa70d058c58 <line:1:11, col:20> col:20 typename ClassType
> | `-CXXRecordDecl 0x7fa70d058d10 <line:2:1, line:5:1> line:2:8 struct Foo definition
> |   |-CXXRecordDecl 0x7fa70d059018 <col:1, col:8> col:8 implicit struct Foo
> |   `-FunctionTemplateDecl 0x7fa70d059280 <line:3:5, line:4:13> col:9 foo
> |     |-TemplateTypeParmDecl 0x7fa70d0590b0 <line:3:15, col:24> col:24 typename T
> |     `-CXXMethodDecl 0x7fa70d0591e8 <line:4:5, col:13> col:9 foo 'int (void)'
> |-FunctionTemplateDecl 0x7fa70d059648 parent 0x7fa70d058d10 prev 0x7fa70d059280 <line:8:1, line:11:1> line:9:21 foo
>   |-TemplateTypeParmDecl 0x7fa70d059370 <line:8:11, col:20> col:20 typename T
>   `-CXXMethodDecl 0x7fa70d059578 parent 0x7fa70d058d10 prev 0x7fa70d0591e8 <line:7:1, line:11:1> line:9:21 foo 'int (void)'
>     `-CompoundStmt 0x7fa70d0596e8 <col:27, line:11:1>
>       `-ReturnStmt 0x7fa70d0596d0 <line:10:5, col:12>
>         `-IntegerLiteral 0x7fa70d0596b0 <col:12> 'int' 42
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev



More information about the cfe-dev mailing list