re PR c++/44524 (improve diagnostic for . vs -> typo)
authorPaolo Carlini <paolo.carlini@oracle.com>
Mon, 17 Oct 2011 17:51:00 +0000 (17:51 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Mon, 17 Oct 2011 17:51:00 +0000 (17:51 +0000)
/cp
2011-10-17  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/44524
* typeck.c (build_class_member_access_expr): Provide a better error
message for X.Y where X is a pointer to class type.
(finish_class_member_access_expr): Likewise.

/testsuite
2011-10-17  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/44524
* g++.dg/parse/error41.C: New.
* g++.dg/parse/error20.C: Adjust.

From-SVN: r180103

gcc/cp/ChangeLog
gcc/cp/typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/parse/error20.C
gcc/testsuite/g++.dg/parse/error41.C [new file with mode: 0644]

index 7e80282a7f5615a90f082130cc5b2fc3cc8a2293..453dce15d486324009a44ef92aeaa6653b9d7939 100644 (file)
@@ -1,3 +1,10 @@
+2011-10-17  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/44524
+       * typeck.c (build_class_member_access_expr): Provide a better error
+       message for X.Y where X is a pointer to class type.
+       (finish_class_member_access_expr): Likewise.
+
 2011-10-15  Tom Tromey  <tromey@redhat.com>
            Dodji Seketeli  <dodji@redhat.com>
 
index 40cf1080c23f2e2bea1140fbcdab689c09240524..749aa3f5ac97f735a172cafdbc00a4ab813f0cca 100644 (file)
@@ -2128,8 +2128,16 @@ build_class_member_access_expr (tree object, tree member,
   if (!CLASS_TYPE_P (object_type))
     {
       if (complain & tf_error)
-       error ("request for member %qD in %qE, which is of non-class type %qT",
-              member, object, object_type);
+       {
+         if (POINTER_TYPE_P (object_type)
+             && CLASS_TYPE_P (TREE_TYPE (object_type)))
+           error ("request for member %qD in %qE, which is of pointer "
+                  "type %qT (maybe you meant to use %<->%> ?)",
+                  member, object, object_type);
+         else
+           error ("request for member %qD in %qE, which is of non-class "
+                  "type %qT", member, object, object_type);
+       }
       return error_mark_node;
     }
 
@@ -2508,8 +2516,16 @@ finish_class_member_access_expr (tree object, tree name, bool template_p,
   if (!CLASS_TYPE_P (object_type))
     {
       if (complain & tf_error)
-       error ("request for member %qD in %qE, which is of non-class type %qT",
-              name, object, object_type);
+       {
+         if (POINTER_TYPE_P (object_type)
+             && CLASS_TYPE_P (TREE_TYPE (object_type)))
+           error ("request for member %qD in %qE, which is of pointer "
+                  "type %qT (maybe you meant to use %<->%> ?)",
+                  name, object, object_type);
+         else
+           error ("request for member %qD in %qE, which is of non-class "
+                  "type %qT", name, object, object_type);
+       }
       return error_mark_node;
     }
 
index b67d0f5e8ae7d3c188506265d1d0b13a347d2e03..3a6edad480e826a848004a53712501ddab29eace 100644 (file)
@@ -1,3 +1,9 @@
+2011-10-17  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/44524
+       * g++.dg/parse/error41.C: New.
+       * g++.dg/parse/error20.C: Adjust.
+
 2011-10-17  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/50757
index d2f9353a7cc661ff5254211fed4c875bf77a3d9b..6119df9b2d1c45bb55e9f59f117136390c93a44d 100644 (file)
@@ -12,7 +12,7 @@ struct C {
 };
 int main() {
   C c;
-  A(c.p.i); // { dg-error "9:request for member 'i' in 'c.C::p', which is of non-class type 'B" }
+  A(c.p.i); // { dg-error "9:request for member 'i' in 'c.C::p', which is of pointer type 'B" }
   return 0;
 }
 
diff --git a/gcc/testsuite/g++.dg/parse/error41.C b/gcc/testsuite/g++.dg/parse/error41.C
new file mode 100644 (file)
index 0000000..621a2e2
--- /dev/null
@@ -0,0 +1,11 @@
+// PR c++/44524
+
+template<typename, typename>
+struct map
+{
+  bool empty();
+};
+
+int bar(map<int, float> *X) {
+  return X.empty();  // { dg-error "which is of pointer type 'map" }
+}