<div dir="ltr">On Thu, Jul 11, 2013 at 10:16 PM, Nico Weber <span dir="ltr"><<a href="mailto:thakis@chromium.org" target="_blank" onclick="window.open('https://mail.google.com/mail/?view=cm&tf=1&to=thakis@chromium.org&cc=&bcc=&su=&body=','_blank');return false;" class="cremed">thakis@chromium.org</a>></span> wrote:<br>
<div class="gmail_extra"><div class="gmail_quote"><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">
Nice, thanks!<div class="gmail_extra"><br><div class="gmail_quote"><div><div class="h5">On Thu, Jul 11, 2013 at 3:38 PM, Kaelyn Uhrain <span dir="ltr"><<a href="mailto:rikka@google.com" target="_blank" onclick="window.open('https://mail.google.com/mail/?view=cm&tf=1&to=rikka@google.com&cc=&bcc=&su=&body=','_blank');return false;" class="cremed">rikka@google.com</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">Author: rikka<br>
Date: Thu Jul 11 17:38:30 2013<br>
New Revision: 186128<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=186128&view=rev" target="_blank" class="cremed">http://llvm.org/viewvc/llvm-project?rev=186128&view=rev</a><br>
Log:<br>
Provide a fixit hint for changing '->' to '.' if there is no operator-><br>
defined for a class.<br>
<br>
Modified:<br>
    cfe/trunk/lib/Sema/SemaOverload.cpp<br>
    cfe/trunk/test/FixIt/fixit.cpp<br>
<br>
Modified: cfe/trunk/lib/Sema/SemaOverload.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOverload.cpp?rev=186128&r1=186127&r2=186128&view=diff" target="_blank" class="cremed">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOverload.cpp?rev=186128&r1=186127&r2=186128&view=diff</a><br>


==============================================================================<br>
--- cfe/trunk/lib/Sema/SemaOverload.cpp (original)<br>
+++ cfe/trunk/lib/Sema/SemaOverload.cpp Thu Jul 11 17:38:30 2013<br>
@@ -11353,10 +11353,17 @@ Sema::BuildOverloadedArrowExpr(Scope *S,<br>
     break;<br>
<br>
   case OR_No_Viable_Function:<br>
-    if (CandidateSet.empty())<br>
-      Diag(OpLoc, diag::err_typecheck_member_reference_arrow)<br>
-        << Base->getType() << Base->getSourceRange();<br>
-    else<br>
+    if (CandidateSet.empty()) {<br>
+      QualType BaseType = Base->getType();<br>
+      if (BaseType->isRecordType() && !BaseType->isPointerType()) {<br>
+        Diag(OpLoc, diag::err_typecheck_member_reference_suggestion)<br>
+          << BaseType << 1 << Base->getSourceRange()<br>
+          << FixItHint::CreateReplacement(OpLoc, ".");<br></blockquote><div><br></div></div></div><div>Since this is a fixit on an error, don't you need to fix up the AST? (<a href="http://clang.llvm.org/docs/InternalsManual.html#fix-it-hints" target="_blank" class="cremed">http://clang.llvm.org/docs/InternalsManual.html#fix-it-hints</a>)</div>
</div></div></div></blockquote><div><br></div><div style>This is a tricky case because of how operator-> is recursively applied to it's own result... from what I could tell, recovery would require not just breaking out of the loop for operator-> in ActOnStartCXXMemberReference but also telling the parser to start over with the '.' in place of the '->', which I have no idea how to do from several function-call-layers within Sema. And I couldn't add the fixit to a note as the internals manual suggests since there is no note associated with the diagnostic.</div>
<div style><br></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_extra">
<div class="gmail_quote"><div><div class="h5">
<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">
+      } else {<br>
+        Diag(OpLoc, diag::err_typecheck_member_reference_arrow)<br>
+          << BaseType << Base->getSourceRange();<br>
+      }<br>
+    } else<br>
       Diag(OpLoc, diag::err_ovl_no_viable_oper)<br>
         << "operator->" << Base->getSourceRange();<br>
     CandidateSet.NoteCandidates(*this, OCD_AllCandidates, Base);<br>
<br>
Modified: cfe/trunk/test/FixIt/fixit.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/FixIt/fixit.cpp?rev=186128&r1=186127&r2=186128&view=diff" target="_blank" class="cremed">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/FixIt/fixit.cpp?rev=186128&r1=186127&r2=186128&view=diff</a><br>


==============================================================================<br>
--- cfe/trunk/test/FixIt/fixit.cpp (original)<br>
+++ cfe/trunk/test/FixIt/fixit.cpp Thu Jul 11 17:38:30 2013<br>
@@ -312,3 +312,15 @@ namespace PR5066 {<br>
   template<typename T> struct X {};<br>
   X<int *p> x; // expected-error {{type-id cannot have a name}}<br>
 }<br>
+<br>
+namespace PR15045 {<br>
+  class Cl0 {<br>
+  public:<br>
+    int a;<br>
+  };<br>
+<br>
+  int f() {<br>
+    Cl0 c;<br>
+    return c->a;  // expected-error {{member reference type 'PR15045::Cl0' is not a pointer; maybe you meant to use '.'?}}<br>
+  }<br>
+}<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu" target="_blank" onclick="window.open('https://mail.google.com/mail/?view=cm&tf=1&to=cfe-commits@cs.uiuc.edu&cc=&bcc=&su=&body=','_blank');return false;" class="cremed">cfe-commits@cs.uiuc.edu</a><br>

<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank" class="cremed">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div></div></div><br></div></div>
</blockquote></div><br></div></div>