<div dir="ltr">On Sat, Jan 24, 2015 at 3:40 AM, Abramo Bagnara <<a href="mailto:abramo.bagnara@bugseng.com">abramo.bagnara@bugseng.com</a>> wrote:<br>><br>> For the following source:<br>><br>> #include <initializer_list><br>> typedef std::initializer_list<int> T;<br>><br>> void f(T);<br>><br>> template <typename U><br>> void g(U);<br>><br>> int main() {<br>>   f(T{0});<br>>   g(T{0});<br>> }<br>><br>> I get this AST (initial part is omitted as it is not relevant):<br>><br>> `-FunctionDecl 0x7960cc0 <line:9:1, line:12:1> line:9:5 main 'int (void)'<br>>   `-CompoundStmt 0x7962d50 <col:12, line:12:1><br>>     |-CallExpr 0x7962180 <line:10:3, col:9> 'void'<br>>     | |-ImplicitCastExpr 0x7962168 <col:3> 'void (*)(T)'<br>> <FunctionToPointerDecay><br>>     | | `-DeclRefExpr 0x79620e0 <col:3> 'void (T)' lvalue Function<br>> 0x7960940 'f' 'void (T)'<br>>     | `-CXXConstructExpr 0x79627a8 <col:6, col:8> 'T':'class<br>> std::initializer_list<int>' 'void (class std::initializer_list<int> &&)<br>> noexcept' elidable<br>>     |   `-MaterializeTemporaryExpr 0x7962550 <col:6, col:8> 'class<br>> std::initializer_list<int>' xvalue<br>>     |     `-CXXStdInitializerListExpr 0x7961fa8 <col:6, col:8><br>> 'T':'class std::initializer_list<int>'<br>>     |       `-MaterializeTemporaryExpr 0x7961f90 <col:6, col:8> 'const<br>> int [1]' xvalue<br>>     |         `-InitListExpr 0x7961f48 <col:6, col:8> 'const int [1]'<br>>     |           `-IntegerLiteral 0x7960e20 <col:7> 'int' 0<br>>     `-CallExpr 0x7962cd0 <line:11:3, col:9> 'void'<br>>       |-ImplicitCastExpr 0x7962cb8 <col:3> 'void (*)(class<br>> std::initializer_list<int>)' <FunctionToPointerDecay><br>>       | `-DeclRefExpr 0x7962c60 <col:3> 'void (class<br>> std::initializer_list<int>)' lvalue Function 0x7962b60 'g' 'void (class<br>> std::initializer_list<int>)' (FunctionTemplate 0x7960c20 'g')<br>>       `-CXXConstructExpr 0x7962d18 <col:6, col:8> 'class<br>> std::initializer_list<int>':'class std::initializer_list<int>' 'void<br>> (class std::initializer_list<int> &&) noexcept' elidable<br>>         `-MaterializeTemporaryExpr 0x7962d00 <col:6, col:8> 'class<br>> std::initializer_list<int>' xvalue<br>>           `-CXXStdInitializerListExpr 0x7962910 <col:6, col:8><br>> 'T':'class std::initializer_list<int>'<br>>             `-MaterializeTemporaryExpr 0x79628f8 <col:6, col:8> 'const<br>> int [1]' xvalue<br>>               `-InitListExpr 0x79628b0 <col:6, col:8> 'const int [1]'<br>>                 `-IntegerLiteral 0x7962848 <col:7> 'int' 0<br>><br>> Looking at AST (and clang sources) I can note two things:<br>><br>> 1) no nodes contains the written TypeLoc for T in function calls<br>> 2) the source range for CXXConstructExpr is wrong<br>> 3) the type is not printed by StmtPrinter.<br>><br>> Once confirmed that, what is the node that should contain such type info<br>> (if any)?<br><br>There should be a CXXFunctionalCastExpr (with cast kind CK_NoOp) between the MaterializeTemporaryExpr and its contained CXXStdInitializerListExpr:<br><br>    `-CallExpr 0x7962cd0 <line:11:3, col:9> 'void'<br>      |-ImplicitCastExpr 0x7962cb8 <col:3> 'void (*)(class std::initializer_list<int>)' <FunctionToPointerDecay><br>      | `-DeclRefExpr 0x7962c60 <col:3> 'void (class std::initializer_list<int>)' lvalue [...]<br>      `-CXXConstructExpr 0x7962d18 <col:6, col:8> [...]<br>        `-MaterializeTemporaryExpr 0x7962d00 <col:6, col:8> 'class std::initializer_list<int>' xvalue<div><b>          `-CXXFunctionalCastExpr 0x... <NoOp><br></b>            `-CXXStdInitializerListExpr 0x7962910 <col:6, col:8> 'T':'class std::initializer_list<int>'<br>              `-MaterializeTemporaryExpr 0x79628f8 <col:6, col:8> 'const int [1]' xvalue<br>                `-InitListExpr 0x79628b0 <col:6, col:8> 'const int [1]'<br>                  `-IntegerLiteral 0x7962848 <col:7> 'int' 0</div><div><br></div><div>This case appears to be missing from Sema::BuildCXXTypeConstructExpr; it looks like it assumes that initialization will give us either a CXXConstructExpr or an InitListExpr.<br></div></div>