<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Thu, Jul 14, 2016 at 3:07 PM, Matthias Gehre via cfe-dev <span dir="ltr"><<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"><div class="gmail_quote"><div dir="ltr">Hi everyone,<div><br></div><div>I don't understand why the AST for </div><div><br></div><div><div>template <int Index> struct B {</div><div>  int independent() {</div><div>    return x[2];</div><div>  }</div><div>  std::array<int,3> x;<br></div><div>};</div></div><div><br></div><div>is </div><div><br></div><div><div>|-ClassTemplateDecl 0x27faf20 <line:89:1, line:104:1> line:89:29 B</div><div>| |-NonTypeTemplateParmDecl 0x27fae20 <col:11, col:15> col:15 referenced 'int' Index</div><div>| |-CXXRecordDecl 0x27fae90 <col:22, line:104:1> line:89:29 struct B definition</div><div>| | |-CXXRecordDecl 0x27fb1b8 <col:22, col:29> col:29 implicit struct B</div><div>| | |-CXXMethodDecl 0x27fb2d0 <line:90:3, line:94:3> line:90:7 independent 'int (void)'</div><div>| | | `-CompoundStmt 0x27fc430 <col:21, line:94:3></div><div>| | |   `-ReturnStmt 0x27fc418 <line:91:5, col:16></div><div>| | |     `-ArraySubscriptExpr 0x27fc3f0 <col:12, col:16> '<dependent type>' lvalue</div><div>| | |       |-MemberExpr 0x27fc378 <col:12> 'std::array<int, 3>':'struct std::array<int, 3>' lvalue ->x 0x27fc318</div><div>| | |       | `-CXXThisExpr 0x27fc360 <col:12> 'B<Index> *' this</div><div>| | |       `-IntegerLiteral 0x27fc3b0 <col:15> 'int' 2<br></div></div><div><br></div><div>Especially, why do we have the ArraySubscriptExpr '<dependent type>'?</div><div><br></div><div>When specializing to B<0>, the ArraySubscriptExpr becomes a CXXOperatorCallExpr as expected:</div><div><br></div><div><div>| |-ClassTemplateSpecializationDecl 0x27fc610 <line:89:1, line:104:1> line:89:29 struct B definition</div><div>| | |-TemplateArgument integral 0</div><div>| | |-CXXRecordDecl 0x27fc878 prev 0x27fc610 <col:22, col:29> col:29 implicit struct B</div><div>| | |-CXXMethodDecl 0x27fc908 <line:90:3, line:94:3> line:90:7 used independent 'int (void)'</div><div>| | | `-CompoundStmt 0x2800648 <col:21, line:94:3></div><div>| | |   `-ReturnStmt 0x2800630 <line:91:5, col:16></div><div>| | |     `-ImplicitCastExpr 0x2800618 <col:12, col:16> 'int':'int' <LValueToRValue></div><div>| | |       `-CXXOperatorCallExpr 0x28005d0 <col:12, col:16> 'int':'int' lvalue</div><div>| | |         |-ImplicitCastExpr 0x28005b8 <col:12, col:16> 'int &(*)(size_t)' <FunctionToPointerDecay></div><div>| | |         | `-DeclRefExpr 0x2800590 <col:12, col:16> 'int &(size_t)' lvalue CXXMethod 0x27fb870 'operator[]' 'int &(size_t)'</div><div>| | |         |-MemberExpr 0x2800540 <col:12> 'std::array<int, 3>':'struct std::array<int, 3>' lvalue ->x 0x27fca78</div><div>| | |         | `-CXXThisExpr 0x2800528 <col:12> 'struct B<0> *' this</div><div>| | |         `-ImplicitCastExpr 0x2800578 <col:14, col:15> 'size_t':'unsigned long' <IntegralCast></div><div>| | |           `-IntegerLiteral 0x27fc3b0 <col:15> 'int' 2<br></div></div><div><br></div><div>Why is the AST for the template and the specialization different? The method does not depend on the template parameter.</div></div></div></div></blockquote><div><br></div><div>Yes, this is wrong; we don't correctly implement the type-dependence rules for class member access expressions specified in core issue 224 (see <a href="http://clang.llvm.org/cxx_dr_status.html#224">http://clang.llvm.org/cxx_dr_status.html#224</a>, <a href="http://wg21.link/cwg224">http://wg21.link/cwg224</a>).</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"><div class="gmail_quote"><div dir="ltr"><div>Thanks for any hints,</div><div><br></div><div>Matthias</div></div>
</div><br></div>
<br>_______________________________________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev</a><br>
<br></blockquote></div><br></div></div>