diff options
author | Paolo Carlini <paolo.carlini@oracle.com> | 2011-10-17 17:51:00 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2011-10-17 17:51:00 +0000 |
commit | a7248d5fe33aa728c44f8d7efef2082353ab9900 (patch) | |
tree | dc6b6815c68df3f834831589f13d4f9e0b6e03bb /gcc | |
parent | 3e8f763093ca87b56616ebef3ee3d194af8c9fcb (diff) | |
download | gcc-a7248d5fe33aa728c44f8d7efef2082353ab9900.zip gcc-a7248d5fe33aa728c44f8d7efef2082353ab9900.tar.gz gcc-a7248d5fe33aa728c44f8d7efef2082353ab9900.tar.bz2 |
re PR c++/44524 (improve diagnostic for . vs -> typo)
/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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/typeck.c | 24 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/parse/error20.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/parse/error41.C | 11 |
5 files changed, 45 insertions, 5 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 7e80282..453dce1 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -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> diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 40cf108..749aa3f 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 b67d0f5..3a6edad 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,11 @@ 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 * g++.dg/warn/format7.C: New. * obj-c++.dg/warn7.mm: Likewise. diff --git a/gcc/testsuite/g++.dg/parse/error20.C b/gcc/testsuite/g++.dg/parse/error20.C index d2f9353..6119df9 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 0000000..621a2e2 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error41.C @@ -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" } +} |