[cfe-commits] r102315 - in /cfe/trunk: include/clang/Basic/DiagnosticSemaKinds.td lib/Sema/SemaExpr.cpp lib/Sema/SemaExprCXX.cpp test/SemaCXX/member-expr.cpp

Douglas Gregor dgregor at apple.com
Sun Apr 25 13:55:09 PDT 2010


Author: dgregor
Date: Sun Apr 25 15:55:08 2010
New Revision: 102315

URL: http://llvm.org/viewvc/llvm-project?rev=102315&view=rev
Log:
Improve the diagnostic when we find something we did not expect in a
member expression (p-> or x.), by showing the type we looked into and
what we did actually find.

Modified:
    cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
    cfe/trunk/lib/Sema/SemaExpr.cpp
    cfe/trunk/lib/Sema/SemaExprCXX.cpp
    cfe/trunk/test/SemaCXX/member-expr.cpp

Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=102315&r1=102314&r2=102315&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Sun Apr 25 15:55:08 2010
@@ -1865,9 +1865,9 @@
 def err_typecheck_member_reference_suggestion : Error<
   "member reference type %0 is %select{a|not a}1 pointer; maybe you meant to use '%select{->|.}1'?">;
 def err_typecheck_member_reference_type : Error<
-  "cannot refer to type member %0 with '%select{.|->}1'">;
+  "cannot refer to type member %0 in %1 with '%select{.|->}2'">;
 def err_typecheck_member_reference_unknown : Error<
-  "cannot refer to member %0 with '%select{.|->}1'">;
+  "cannot refer to member %0 in %1 with '%select{.|->}2'">;
 def err_member_reference_needs_call : Error<
   "base of member reference has function type %0; perhaps you meant to call "
   "this function with '()'?">;
@@ -2181,8 +2181,8 @@
   "deleting pointer to incomplete type %0 may cause undefined behaviour">;
 def err_no_suitable_delete_member_function_found : Error<
   "no suitable member %0 in %1">;
-def note_delete_member_function_declared_here : Note<
-  "%0 declared here">;
+def note_member_declared_here : Note<
+  "member %0 declared here">;
 def err_decrement_bool : Error<"cannot decrement expression of type bool">;
 def warn_increment_bool : Warning<
   "incrementing expression of type bool is deprecated">, InGroup<Deprecated>;

Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=102315&r1=102314&r2=102315&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExpr.cpp Sun Apr 25 15:55:08 2010
@@ -2824,16 +2824,17 @@
 
   Owned(BaseExpr);
 
+  // We found something that we didn't expect. Complain.
   if (isa<TypeDecl>(MemberDecl))
-    return ExprError(Diag(MemberLoc,diag::err_typecheck_member_reference_type)
-                     << MemberName << int(IsArrow));
+    Diag(MemberLoc,diag::err_typecheck_member_reference_type)
+      << MemberName << BaseType << int(IsArrow);
+  else
+    Diag(MemberLoc, diag::err_typecheck_member_reference_unknown)
+      << MemberName << BaseType << int(IsArrow);
 
-  // We found a declaration kind that we didn't expect. This is a
-  // generic error message that tells the user that she can't refer
-  // to this member with '.' or '->'.
-  return ExprError(Diag(MemberLoc,
-                        diag::err_typecheck_member_reference_unknown)
-      << MemberName << int(IsArrow));
+  Diag(MemberDecl->getLocation(), diag::note_member_declared_here)
+    << MemberName;
+  return ExprError();
 }
 
 /// Look up the given member of the given non-type-dependent

Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=102315&r1=102314&r2=102315&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExprCXX.cpp Sun Apr 25 15:55:08 2010
@@ -1261,8 +1261,7 @@
         
     for (LookupResult::iterator F = Found.begin(), FEnd = Found.end();
          F != FEnd; ++F) {
-      Diag((*F)->getLocation(), 
-           diag::note_delete_member_function_declared_here)
+      Diag((*F)->getLocation(), diag::note_member_declared_here)
         << Name;
     }
 

Modified: cfe/trunk/test/SemaCXX/member-expr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/member-expr.cpp?rev=102315&r1=102314&r2=102315&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/member-expr.cpp (original)
+++ cfe/trunk/test/SemaCXX/member-expr.cpp Sun Apr 25 15:55:08 2010
@@ -2,7 +2,7 @@
 
 class X{
 public:
-  enum E {Enumerator};
+  enum E {Enumerator}; // expected-note 2{{declared here}}
   int f();
   static int mem;
   static float g();
@@ -11,8 +11,8 @@
 void test(X* xp, X x) {
   int i1 = x.f();
   int i2 = xp->f();
-  x.E; // expected-error{{cannot refer to type member 'E' with '.'}}
-  xp->E; // expected-error{{cannot refer to type member 'E' with '->'}}
+  x.E; // expected-error{{cannot refer to type member 'E' in 'X' with '.'}}
+  xp->E; // expected-error{{cannot refer to type member 'E' in 'X' with '->'}}
   int i3 = x.Enumerator;
   int i4 = xp->Enumerator;
   x.mem = 1;





More information about the cfe-commits mailing list