Skip to content

Instantly share code, notes, and snippets.

@andijcr
Created March 11, 2022 09:31
Show Gist options
  • Save andijcr/5605451dce3cc385951648ab0c26dfd0 to your computer and use it in GitHub Desktop.
Save andijcr/5605451dce3cc385951648ab0c26dfd0 to your computer and use it in GitHub Desktop.
to view the ast for this snippet: clang++ -Xclang -ast-dump -fsyntax-only hello.cpp
|-TypedefDecl 0x154f310 <<invalid sloc>> <invalid sloc> implicit __int128_t '__int128'
| `-BuiltinType 0x154efb0 '__int128'
|-TypedefDecl 0x154f380 <<invalid sloc>> <invalid sloc> implicit __uint128_t 'unsigned __int128'
| `-BuiltinType 0x154efd0 'unsigned __int128'
|-TypedefDecl 0x154f6f8 <<invalid sloc>> <invalid sloc> implicit __NSConstantString '__NSConstantString_tag'
| `-RecordType 0x154f470 '__NSConstantString_tag'
| `-CXXRecord 0x154f3d8 '__NSConstantString_tag'
|-TypedefDecl 0x154f790 <<invalid sloc>> <invalid sloc> implicit __builtin_ms_va_list 'char *'
| `-PointerType 0x154f750 'char *'
| `-BuiltinType 0x154eab0 'char'
|-TypedefDecl 0x158fec8 <<invalid sloc>> <invalid sloc> implicit __builtin_va_list '__va_list_tag [1]'
| `-ConstantArrayType 0x158fe70 '__va_list_tag [1]' 1
| `-RecordType 0x154f880 '__va_list_tag'
| `-CXXRecord 0x154f7e8 '__va_list_tag'
|-FunctionDecl 0x1590000 <hello.cpp:2:1, col:23> col:5 used puts 'int (const char *)'
| `-ParmVarDecl 0x158ff38 <col:10, col:22> col:22 s 'const char *'
`-FunctionDecl 0x1590290 <line:4:1, line:10:1> line:4:5 main 'int (int, char **)'
|-ParmVarDecl 0x1590108 <col:10, col:14> col:14 used argc 'int'
|-ParmVarDecl 0x15901b0 <col:20, col:27> col:27 used argv 'char **'
`-CompoundStmt 0x1590960 <col:32, line:10:1>
|-CallExpr 0x1590490 <line:5:2, col:14> 'int'
| |-ImplicitCastExpr 0x1590478 <col:2> 'int (*)(const char *)' <FunctionToPointerDecay>
| | `-DeclRefExpr 0x1590428 <col:2> 'int (const char *)' lvalue Function 0x1590000 'puts' 'int (const char *)'
| `-ImplicitCastExpr 0x15904b8 <col:7> 'const char *' <ArrayToPointerDecay>
| `-StringLiteral 0x1590408 <col:7> 'const char [6]' lvalue "hello"
|-ForStmt 0x15908f8 <line:6:2, line:8:2>
| |-DeclStmt 0x1590698 <line:6:6, col:14>
| | `-VarDecl 0x1590530 <col:6, col:13> col:11 used i 'int':'int' cinit
| | `-IntegerLiteral 0x1590598 <col:13> 'int' 0
| |-<<<NULL>>>
| |-BinaryOperator 0x1590720 <col:16, col:18> 'bool' '<'
| | |-ImplicitCastExpr 0x15906f0 <col:16> 'int':'int' <LValueToRValue>
| | | `-DeclRefExpr 0x15906b0 <col:16> 'int':'int' lvalue Var 0x1590530 'i' 'int':'int'
| | `-ImplicitCastExpr 0x1590708 <col:18> 'int' <LValueToRValue>
| | `-DeclRefExpr 0x15906d0 <col:18> 'int' lvalue ParmVar 0x1590108 'argc' 'int'
| |-UnaryOperator 0x1590760 <col:24, col:26> 'int':'int' lvalue prefix '++'
| | `-DeclRefExpr 0x1590740 <col:26> 'int':'int' lvalue Var 0x1590530 'i' 'int':'int'
| `-CompoundStmt 0x15908e0 <col:28, line:8:2>
| `-CallExpr 0x1590888 <line:7:3, col:15> 'int'
| |-ImplicitCastExpr 0x1590870 <col:3> 'int (*)(const char *)' <FunctionToPointerDecay>
| | `-DeclRefExpr 0x1590850 <col:3> 'int (const char *)' lvalue Function 0x1590000 'puts' 'int (const char *)'
| `-ImplicitCastExpr 0x15908c8 <col:8, col:14> 'const char *' <NoOp>
| `-ImplicitCastExpr 0x15908b0 <col:8, col:14> 'char *' <LValueToRValue>
| `-ArraySubscriptExpr 0x1590830 <col:8, col:14> 'char *' lvalue
| |-ImplicitCastExpr 0x1590800 <col:8> 'char **' <LValueToRValue>
| | `-DeclRefExpr 0x15907c0 <col:8> 'char **' lvalue ParmVar 0x15901b0 'argv' 'char **'
| `-ImplicitCastExpr 0x1590818 <col:13> 'int':'int' <LValueToRValue>
| `-DeclRefExpr 0x15907e0 <col:13> 'int':'int' lvalue Var 0x1590530 'i' 'int':'int'
`-ReturnStmt 0x1590950 <line:9:2, col:9>
`-IntegerLiteral 0x1590930 <col:9> 'int' 0
<pre><font color="#12488B">|-</font><font color="#26A269"><b>TypedefDecl</b></font><font color="#A2734C"> 0x154f310</font> &lt;<font color="#A2734C">&lt;invalid sloc&gt;</font>&gt; <font color="#A2734C">&lt;invalid sloc&gt;</font> implicit<font color="#2AA1B3"><b> __int128_t</b></font> <font color="#26A269">&apos;__int128&apos;</font>
<font color="#12488B">| `-</font><font color="#26A269">BuiltinType</font><font color="#A2734C"> 0x154efb0</font> <font color="#26A269">&apos;__int128&apos;</font>
<font color="#12488B">|-</font><font color="#26A269"><b>TypedefDecl</b></font><font color="#A2734C"> 0x154f380</font> &lt;<font color="#A2734C">&lt;invalid sloc&gt;</font>&gt; <font color="#A2734C">&lt;invalid sloc&gt;</font> implicit<font color="#2AA1B3"><b> __uint128_t</b></font> <font color="#26A269">&apos;unsigned __int128&apos;</font>
<font color="#12488B">| `-</font><font color="#26A269">BuiltinType</font><font color="#A2734C"> 0x154efd0</font> <font color="#26A269">&apos;unsigned __int128&apos;</font>
<font color="#12488B">|-</font><font color="#26A269"><b>TypedefDecl</b></font><font color="#A2734C"> 0x154f6f8</font> &lt;<font color="#A2734C">&lt;invalid sloc&gt;</font>&gt; <font color="#A2734C">&lt;invalid sloc&gt;</font> implicit<font color="#2AA1B3"><b> __NSConstantString</b></font> <font color="#26A269">&apos;__NSConstantString_tag&apos;</font>
<font color="#12488B">| `-</font><font color="#26A269">RecordType</font><font color="#A2734C"> 0x154f470</font> <font color="#26A269">&apos;__NSConstantString_tag&apos;</font>
<font color="#12488B">| `-</font><font color="#26A269"><b>CXXRecord</b></font><font color="#A2734C"> 0x154f3d8</font><font color="#2AA1B3"><b> &apos;__NSConstantString_tag&apos;</b></font>
<font color="#12488B">|-</font><font color="#26A269"><b>TypedefDecl</b></font><font color="#A2734C"> 0x154f790</font> &lt;<font color="#A2734C">&lt;invalid sloc&gt;</font>&gt; <font color="#A2734C">&lt;invalid sloc&gt;</font> implicit<font color="#2AA1B3"><b> __builtin_ms_va_list</b></font> <font color="#26A269">&apos;char *&apos;</font>
<font color="#12488B">| `-</font><font color="#26A269">PointerType</font><font color="#A2734C"> 0x154f750</font> <font color="#26A269">&apos;char *&apos;</font>
<font color="#12488B">| `-</font><font color="#26A269">BuiltinType</font><font color="#A2734C"> 0x154eab0</font> <font color="#26A269">&apos;char&apos;</font>
<font color="#12488B">|-</font><font color="#26A269"><b>TypedefDecl</b></font><font color="#A2734C"> 0x158fec8</font> &lt;<font color="#A2734C">&lt;invalid sloc&gt;</font>&gt; <font color="#A2734C">&lt;invalid sloc&gt;</font> implicit<font color="#2AA1B3"><b> __builtin_va_list</b></font> <font color="#26A269">&apos;__va_list_tag [1]&apos;</font>
<font color="#12488B">| `-</font><font color="#26A269">ConstantArrayType</font><font color="#A2734C"> 0x158fe70</font> <font color="#26A269">&apos;__va_list_tag [1]&apos;</font> 1
<font color="#12488B">| `-</font><font color="#26A269">RecordType</font><font color="#A2734C"> 0x154f880</font> <font color="#26A269">&apos;__va_list_tag&apos;</font>
<font color="#12488B">| `-</font><font color="#26A269"><b>CXXRecord</b></font><font color="#A2734C"> 0x154f7e8</font><font color="#2AA1B3"><b> &apos;__va_list_tag&apos;</b></font>
<font color="#12488B">|-</font><font color="#26A269"><b>FunctionDecl</b></font><font color="#A2734C"> 0x1590000</font> &lt;<font color="#A2734C">hello.cpp:2:1</font>, <font color="#A2734C">col:23</font>&gt; <font color="#A2734C">col:5</font> used<font color="#2AA1B3"><b> puts</b></font> <font color="#26A269">&apos;int (const char *)&apos;</font>
<font color="#12488B">| `-</font><font color="#26A269"><b>ParmVarDecl</b></font><font color="#A2734C"> 0x158ff38</font> &lt;<font color="#A2734C">col:10</font>, <font color="#A2734C">col:22</font>&gt; <font color="#A2734C">col:22</font><font color="#2AA1B3"><b> s</b></font> <font color="#26A269">&apos;const char *&apos;</font>
<font color="#12488B">`-</font><font color="#26A269"><b>FunctionDecl</b></font><font color="#A2734C"> 0x1590290</font> &lt;<font color="#A2734C">line:4:1</font>, <font color="#A2734C">line:10:1</font>&gt; <font color="#A2734C">line:4:5</font><font color="#2AA1B3"><b> main</b></font> <font color="#26A269">&apos;int (int, char **)&apos;</font>
<font color="#12488B"> |-</font><font color="#26A269"><b>ParmVarDecl</b></font><font color="#A2734C"> 0x1590108</font> &lt;<font color="#A2734C">col:10</font>, <font color="#A2734C">col:14</font>&gt; <font color="#A2734C">col:14</font> used<font color="#2AA1B3"><b> argc</b></font> <font color="#26A269">&apos;int&apos;</font>
<font color="#12488B"> |-</font><font color="#26A269"><b>ParmVarDecl</b></font><font color="#A2734C"> 0x15901b0</font> &lt;<font color="#A2734C">col:20</font>, <font color="#A2734C">col:27</font>&gt; <font color="#A2734C">col:27</font> used<font color="#2AA1B3"><b> argv</b></font> <font color="#26A269">&apos;char **&apos;</font>
<font color="#12488B"> `-</font><font color="#A347BA"><b>CompoundStmt</b></font><font color="#A2734C"> 0x1590960</font> &lt;<font color="#A2734C">col:32</font>, <font color="#A2734C">line:10:1</font>&gt;
<font color="#12488B"> |-</font><font color="#A347BA"><b>CallExpr</b></font><font color="#A2734C"> 0x1590490</font> &lt;<font color="#A2734C">line:5:2</font>, <font color="#A2734C">col:14</font>&gt; <font color="#26A269">&apos;int&apos;</font>
<font color="#12488B"> | |-</font><font color="#A347BA"><b>ImplicitCastExpr</b></font><font color="#A2734C"> 0x1590478</font> &lt;<font color="#A2734C">col:2</font>&gt; <font color="#26A269">&apos;int (*)(const char *)&apos;</font> &lt;<font color="#C01C28">FunctionToPointerDecay</font>&gt;
<font color="#12488B"> | | `-</font><font color="#A347BA"><b>DeclRefExpr</b></font><font color="#A2734C"> 0x1590428</font> &lt;<font color="#A2734C">col:2</font>&gt; <font color="#26A269">&apos;int (const char *)&apos;</font><font color="#2AA1B3"> lvalue</font> <font color="#26A269"><b>Function</b></font><font color="#A2734C"> 0x1590000</font><font color="#2AA1B3"><b> &apos;puts&apos;</b></font> <font color="#26A269">&apos;int (const char *)&apos;</font>
<font color="#12488B"> | `-</font><font color="#A347BA"><b>ImplicitCastExpr</b></font><font color="#A2734C"> 0x15904b8</font> &lt;<font color="#A2734C">col:7</font>&gt; <font color="#26A269">&apos;const char *&apos;</font> &lt;<font color="#C01C28">ArrayToPointerDecay</font>&gt;
<font color="#12488B"> | `-</font><font color="#A347BA"><b>StringLiteral</b></font><font color="#A2734C"> 0x1590408</font> &lt;<font color="#A2734C">col:7</font>&gt; <font color="#26A269">&apos;const char [6]&apos;</font><font color="#2AA1B3"> lvalue</font><font color="#2AA1B3"><b> &quot;hello&quot;</b></font>
<font color="#12488B"> |-</font><font color="#A347BA"><b>ForStmt</b></font><font color="#A2734C"> 0x15908f8</font> &lt;<font color="#A2734C">line:6:2</font>, <font color="#A2734C">line:8:2</font>&gt;
<font color="#12488B"> | |-</font><font color="#A347BA"><b>DeclStmt</b></font><font color="#A2734C"> 0x1590698</font> &lt;<font color="#A2734C">line:6:6</font>, <font color="#A2734C">col:14</font>&gt;
<font color="#12488B"> | | `-</font><font color="#26A269"><b>VarDecl</b></font><font color="#A2734C"> 0x1590530</font> &lt;<font color="#A2734C">col:6</font>, <font color="#A2734C">col:13</font>&gt; <font color="#A2734C">col:11</font> used<font color="#2AA1B3"><b> i</b></font> <font color="#26A269">&apos;int&apos;:&apos;int&apos;</font> cinit
<font color="#12488B"> | | `-</font><font color="#A347BA"><b>IntegerLiteral</b></font><font color="#A2734C"> 0x1590598</font> &lt;<font color="#A2734C">col:13</font>&gt; <font color="#26A269">&apos;int&apos;</font><font color="#2AA1B3"><b> 0</b></font>
<font color="#12488B"> | |-&lt;&lt;&lt;NULL&gt;&gt;&gt;</font>
<font color="#12488B"> | |-</font><font color="#A347BA"><b>BinaryOperator</b></font><font color="#A2734C"> 0x1590720</font> &lt;<font color="#A2734C">col:16</font>, <font color="#A2734C">col:18</font>&gt; <font color="#26A269">&apos;bool&apos;</font> &apos;&lt;&apos;
<font color="#12488B"> | | |-</font><font color="#A347BA"><b>ImplicitCastExpr</b></font><font color="#A2734C"> 0x15906f0</font> &lt;<font color="#A2734C">col:16</font>&gt; <font color="#26A269">&apos;int&apos;:&apos;int&apos;</font> &lt;<font color="#C01C28">LValueToRValue</font>&gt;
<font color="#12488B"> | | | `-</font><font color="#A347BA"><b>DeclRefExpr</b></font><font color="#A2734C"> 0x15906b0</font> &lt;<font color="#A2734C">col:16</font>&gt; <font color="#26A269">&apos;int&apos;:&apos;int&apos;</font><font color="#2AA1B3"> lvalue</font> <font color="#26A269"><b>Var</b></font><font color="#A2734C"> 0x1590530</font><font color="#2AA1B3"><b> &apos;i&apos;</b></font> <font color="#26A269">&apos;int&apos;:&apos;int&apos;</font>
<font color="#12488B"> | | `-</font><font color="#A347BA"><b>ImplicitCastExpr</b></font><font color="#A2734C"> 0x1590708</font> &lt;<font color="#A2734C">col:18</font>&gt; <font color="#26A269">&apos;int&apos;</font> &lt;<font color="#C01C28">LValueToRValue</font>&gt;
<font color="#12488B"> | | `-</font><font color="#A347BA"><b>DeclRefExpr</b></font><font color="#A2734C"> 0x15906d0</font> &lt;<font color="#A2734C">col:18</font>&gt; <font color="#26A269">&apos;int&apos;</font><font color="#2AA1B3"> lvalue</font> <font color="#26A269"><b>ParmVar</b></font><font color="#A2734C"> 0x1590108</font><font color="#2AA1B3"><b> &apos;argc&apos;</b></font> <font color="#26A269">&apos;int&apos;</font>
<font color="#12488B"> | |-</font><font color="#A347BA"><b>UnaryOperator</b></font><font color="#A2734C"> 0x1590760</font> &lt;<font color="#A2734C">col:24</font>, <font color="#A2734C">col:26</font>&gt; <font color="#26A269">&apos;int&apos;:&apos;int&apos;</font><font color="#2AA1B3"> lvalue</font> prefix &apos;++&apos;
<font color="#12488B"> | | `-</font><font color="#A347BA"><b>DeclRefExpr</b></font><font color="#A2734C"> 0x1590740</font> &lt;<font color="#A2734C">col:26</font>&gt; <font color="#26A269">&apos;int&apos;:&apos;int&apos;</font><font color="#2AA1B3"> lvalue</font> <font color="#26A269"><b>Var</b></font><font color="#A2734C"> 0x1590530</font><font color="#2AA1B3"><b> &apos;i&apos;</b></font> <font color="#26A269">&apos;int&apos;:&apos;int&apos;</font>
<font color="#12488B"> | `-</font><font color="#A347BA"><b>CompoundStmt</b></font><font color="#A2734C"> 0x15908e0</font> &lt;<font color="#A2734C">col:28</font>, <font color="#A2734C">line:8:2</font>&gt;
<font color="#12488B"> | `-</font><font color="#A347BA"><b>CallExpr</b></font><font color="#A2734C"> 0x1590888</font> &lt;<font color="#A2734C">line:7:3</font>, <font color="#A2734C">col:15</font>&gt; <font color="#26A269">&apos;int&apos;</font>
<font color="#12488B"> | |-</font><font color="#A347BA"><b>ImplicitCastExpr</b></font><font color="#A2734C"> 0x1590870</font> &lt;<font color="#A2734C">col:3</font>&gt; <font color="#26A269">&apos;int (*)(const char *)&apos;</font> &lt;<font color="#C01C28">FunctionToPointerDecay</font>&gt;
<font color="#12488B"> | | `-</font><font color="#A347BA"><b>DeclRefExpr</b></font><font color="#A2734C"> 0x1590850</font> &lt;<font color="#A2734C">col:3</font>&gt; <font color="#26A269">&apos;int (const char *)&apos;</font><font color="#2AA1B3"> lvalue</font> <font color="#26A269"><b>Function</b></font><font color="#A2734C"> 0x1590000</font><font color="#2AA1B3"><b> &apos;puts&apos;</b></font> <font color="#26A269">&apos;int (const char *)&apos;</font>
<font color="#12488B"> | `-</font><font color="#A347BA"><b>ImplicitCastExpr</b></font><font color="#A2734C"> 0x15908c8</font> &lt;<font color="#A2734C">col:8</font>, <font color="#A2734C">col:14</font>&gt; <font color="#26A269">&apos;const char *&apos;</font> &lt;<font color="#C01C28">NoOp</font>&gt;
<font color="#12488B"> | `-</font><font color="#A347BA"><b>ImplicitCastExpr</b></font><font color="#A2734C"> 0x15908b0</font> &lt;<font color="#A2734C">col:8</font>, <font color="#A2734C">col:14</font>&gt; <font color="#26A269">&apos;char *&apos;</font> &lt;<font color="#C01C28">LValueToRValue</font>&gt;
<font color="#12488B"> | `-</font><font color="#A347BA"><b>ArraySubscriptExpr</b></font><font color="#A2734C"> 0x1590830</font> &lt;<font color="#A2734C">col:8</font>, <font color="#A2734C">col:14</font>&gt; <font color="#26A269">&apos;char *&apos;</font><font color="#2AA1B3"> lvalue</font>
<font color="#12488B"> | |-</font><font color="#A347BA"><b>ImplicitCastExpr</b></font><font color="#A2734C"> 0x1590800</font> &lt;<font color="#A2734C">col:8</font>&gt; <font color="#26A269">&apos;char **&apos;</font> &lt;<font color="#C01C28">LValueToRValue</font>&gt;
<font color="#12488B"> | | `-</font><font color="#A347BA"><b>DeclRefExpr</b></font><font color="#A2734C"> 0x15907c0</font> &lt;<font color="#A2734C">col:8</font>&gt; <font color="#26A269">&apos;char **&apos;</font><font color="#2AA1B3"> lvalue</font> <font color="#26A269"><b>ParmVar</b></font><font color="#A2734C"> 0x15901b0</font><font color="#2AA1B3"><b> &apos;argv&apos;</b></font> <font color="#26A269">&apos;char **&apos;</font>
<font color="#12488B"> | `-</font><font color="#A347BA"><b>ImplicitCastExpr</b></font><font color="#A2734C"> 0x1590818</font> &lt;<font color="#A2734C">col:13</font>&gt; <font color="#26A269">&apos;int&apos;:&apos;int&apos;</font> &lt;<font color="#C01C28">LValueToRValue</font>&gt;
<font color="#12488B"> | `-</font><font color="#A347BA"><b>DeclRefExpr</b></font><font color="#A2734C"> 0x15907e0</font> &lt;<font color="#A2734C">col:13</font>&gt; <font color="#26A269">&apos;int&apos;:&apos;int&apos;</font><font color="#2AA1B3"> lvalue</font> <font color="#26A269"><b>Var</b></font><font color="#A2734C"> 0x1590530</font><font color="#2AA1B3"><b> &apos;i&apos;</b></font> <font color="#26A269">&apos;int&apos;:&apos;int&apos;</font>
<font color="#12488B"> `-</font><font color="#A347BA"><b>ReturnStmt</b></font><font color="#A2734C"> 0x1590950</font> &lt;<font color="#A2734C">line:9:2</font>, <font color="#A2734C">col:9</font>&gt;
<font color="#12488B"> `-</font><font color="#A347BA"><b>IntegerLiteral</b></font><font color="#A2734C"> 0x1590930</font> &lt;<font color="#A2734C">col:9</font>&gt; <font color="#26A269">&apos;int&apos;</font><font color="#2AA1B3"><b> 0</b></font>
</pre>
int puts(const char *s);
int main(int argc, char** argv){
puts("hello");
for(auto i=0; i<argc; ++i){
puts(argv[i]);
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment