From: Kriang Lerdsuwanakij Date: Mon, 5 May 2003 14:35:58 +0000 (+0000) Subject: re PR c++/10496 ([diagnostic] erroneus suggestion in diagnostic asks the user to... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=16692dd506a49f4841b7534ae6f8e940a2cefe46;p=gcc.git re PR c++/10496 ([diagnostic] erroneus suggestion in diagnostic asks the user to write "&const class::memfun" which is illegal) PR c++/10496 * typeck.c (build_unary_op): Don't output const qualifier when output invalid pointer-to-member diagnostics. * g++.dg/warn/pmf1.C: New test. From-SVN: r66481 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index f557fe297a8..3567da7c0b2 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2003-05-05 Kriang Lerdsuwanakij + + PR c++/10496 + * typeck.c (build_unary_op): Don't output const qualifier when + output invalid pointer-to-member diagnostics. + 2003-05-05 Kriang Lerdsuwanakij * decl.c: Fix typos. diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index bb99adc6fc0..35073dc3a7c 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -4435,12 +4435,21 @@ build_unary_op (code, xarg, noconvert) if (! flag_ms_extensions) { + /* Inside constant member functions, the `this' pointer + contains an extra const qualifier. TYPE_MAIN_VARIANT + is used here to remove this const from the diagnostics. */ if (current_class_type && TREE_OPERAND (arg, 0) == current_class_ref) /* An expression like &memfn. */ - pedwarn ("ISO C++ forbids taking the address of an unqualified or parenthesized non-static member function to form a pointer to member function. Say `&%T::%D'", base, name); + pedwarn ("ISO C++ forbids taking the address of an unqualified" + " or parenthesized non-static member function to form" + " a pointer to member function. Say `&%T::%D'", + TYPE_MAIN_VARIANT (base), name); else - pedwarn ("ISO C++ forbids taking the address of a bound member function to form a pointer to member function. Say `&%T::%D'", base, name); + pedwarn ("ISO C++ forbids taking the address of a bound member" + " function to form a pointer to member function." + " Say `&%T::%D'", + TYPE_MAIN_VARIANT (base), name); } arg = build_offset_ref (base, name); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index aec72724b3e..c86b9217d6f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2003-05-05 Kriang Lerdsuwanakij + + PR c++/10496 + * g++.dg/warn/pmf1.C: New test. + 2003-05-05 Kriang Lerdsuwanakij PR c++/4494 diff --git a/gcc/testsuite/g++.dg/warn/pmf1.C b/gcc/testsuite/g++.dg/warn/pmf1.C new file mode 100644 index 00000000000..013c21b6db9 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pmf1.C @@ -0,0 +1,18 @@ +// { dg-do compile } + +// Origin: benko@sztaki.hu + +// PR c++/10496: Incorrect pointer to member function diagnostics +// for constant member functions. + +struct a +{ + int f() const; +}; + + +int +a::f() const +{ + int (a::* b)() const = &f; // { dg-error "&a::f" } +}