<div dir="ltr"><div>I think the only way this could be dependent is if you have dependent bases, but there may be awkward cases I haven't thought about.</div><div><br></div><div>Consider this code in SemaExprMember.cpp:</div>
<div><div>ExprResult</div><div>Sema::BuildMemberReferenceExpr(Expr *Base, QualType BaseType,</div><div>                               SourceLocation OpLoc, bool IsArrow,</div><div>                               CXXScopeSpec &SS,</div>
<div>                               SourceLocation TemplateKWLoc,</div><div>                               NamedDecl *FirstQualifierInScope,</div><div>                               const DeclarationNameInfo &NameInfo,</div>
<div>                               const TemplateArgumentListInfo *TemplateArgs,</div><div>                               ActOnMemberAccessExtraArgs *ExtraArgs) {</div><div>  if (BaseType->isDependentType() ||</div><div>
      (SS.isSet() && isDependentScopeSpecifier(SS)))</div><div>    return ActOnDependentMemberExpr(Base, BaseType,</div><div>                                    IsArrow, OpLoc,</div><div>                                    SS, TemplateKWLoc, FirstQualifierInScope,</div>
<div>                                    NameInfo, TemplateArgs);</div><div><br></div></div><div>Perhaps it could look at the BaseType to see if it is a record decl that does not have any dependent bases, and in that case form a regular MemberExpr.</div>
<div><br></div><div>In the implicit case, i is unqualified and ADL doesn't fire, so it can't be dependent.</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Fri, Aug 22, 2014 at 12:56 PM, Jason Haslam <span dir="ltr"><<a href="mailto:jason.haslam@gmail.com" target="_blank">jason.haslam@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi all,<br>
<br>
I find that explicit this expressions in class templates create a CXXDependentScopeMemberExpr in the AST while the equivalent implicit this is a MemberExpr. For example code like this:<br>
<br>
template <typename T> struct A {<br>
  int i;<br>
  int getImplicit() { return i; } // MemberExpr<br>
  int getExplicit() { return this->i; } // CXXDependentScopeMemberExpr<br>
};<br>
<br>
Why is explicit dependent? Is it technical (per the language standard) or an implementation detail? I’d like both expressions to resolve to the member for static analysis/refactoring/etc.<br>
<br>
Jason<br>
<br>
<br>
_______________________________________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@cs.uiuc.edu">cfe-dev@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev</a><br>
</blockquote></div><br></div>