From a7248d5fe33aa728c44f8d7efef2082353ab9900 Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Mon, 17 Oct 2011 17:51:00 +0000 Subject: [PATCH] re PR c++/44524 (improve diagnostic for . vs -> typo) /cp 2011-10-17 Paolo Carlini 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 PR c++/44524 * g++.dg/parse/error41.C: New. * g++.dg/parse/error20.C: Adjust. From-SVN: r180103 --- gcc/cp/ChangeLog | 7 +++++++ gcc/cp/typeck.c | 24 ++++++++++++++++++++---- gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/g++.dg/parse/error20.C | 2 +- gcc/testsuite/g++.dg/parse/error41.C | 11 +++++++++++ 5 files changed, 45 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/g++.dg/parse/error41.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 7e80282a7f5..453dce15d48 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2011-10-17 Paolo Carlini + + 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 Dodji Seketeli diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 40cf1080c23..749aa3f5ac9 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -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; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b67d0f5e8ae..3a6edad480e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2011-10-17 Paolo Carlini + + PR c++/44524 + * g++.dg/parse/error41.C: New. + * g++.dg/parse/error20.C: Adjust. + 2011-10-17 Paolo Carlini PR c++/50757 diff --git a/gcc/testsuite/g++.dg/parse/error20.C b/gcc/testsuite/g++.dg/parse/error20.C index d2f9353a7cc..6119df9b2d1 100644 --- a/gcc/testsuite/g++.dg/parse/error20.C +++ b/gcc/testsuite/g++.dg/parse/error20.C @@ -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 index 00000000000..621a2e252ed --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error41.C @@ -0,0 +1,11 @@ +// PR c++/44524 + +template +struct map +{ + bool empty(); +}; + +int bar(map *X) { + return X.empty(); // { dg-error "which is of pointer type 'map" } +}