[cfe-dev] Extent for templated functions seems off

Jared Grubb via cfe-dev cfe-dev at lists.llvm.org
Fri Sep 15 17:10:55 PDT 2017


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.

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

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20170915/c973ac86/attachment.html>


More information about the cfe-dev mailing list