From 58c98d699832fe70847b1c3c4542e94af09b3e0f Mon Sep 17 00:00:00 2001 From: jason Date: Wed, 20 Jan 2010 21:30:20 +0000 Subject: [PATCH] PR c++/40750 * decl.c (grokdeclarator): Clear type_quals for a member function declared using a typedef. Don't complain about adding cv-quals to a function typedef in C++0x mode. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@156084 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 7 +++++++ gcc/cp/decl.c | 3 ++- gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/g++.dg/other/cv_func.C | 3 +-- gcc/testsuite/g++.dg/parse/fn-typedef1.C | 18 ++++++++++++++++++ 5 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/parse/fn-typedef1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 8059a93ab7e..726983807bb 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2010-01-20 Jason Merrill + + PR c++/40750 + * decl.c (grokdeclarator): Clear type_quals for a member function + declared using a typedef. Don't complain about adding cv-quals + to a function typedef in C++0x mode. + 2010-01-20 Jakub Jelinek * decl.c (create_array_type_for_decl): Remove set but not used diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 962477161cb..920d75b75a8 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -8149,7 +8149,7 @@ grokdeclarator (const cp_declarator *declarator, /* This was an error in C++98 (cv-qualifiers cannot be added to a function type), but DR 295 makes the code well-formed by dropping the extra qualifiers. */ - if (pedantic) + if (pedantic && cxx_dialect == cxx98) { tree bad_type = build_qualified_type (type, type_quals); pedwarn (input_location, OPT_pedantic, @@ -9046,6 +9046,7 @@ grokdeclarator (const cp_declarator *declarator, /* The qualifiers on the function type become the qualifiers on the non-static member function. */ memfn_quals |= cp_type_quals (type); + type_quals = TYPE_UNQUALIFIED; } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 90c8ca73bd3..db9bb35d515 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2010-01-20 Jason Merrill + + PR c++/40750 + * g++.dg/parse/fn-typedef1.C: New. + * g++.dg/other/cv_quals.C: Adjust. + 2010-01-20 Anthony Green * gcc.dg/cpp/_Pragma6.c: Skip this test for moxie-*-* (no diff --git a/gcc/testsuite/g++.dg/other/cv_func.C b/gcc/testsuite/g++.dg/other/cv_func.C index 4f103824d93..788c173b423 100644 --- a/gcc/testsuite/g++.dg/other/cv_func.C +++ b/gcc/testsuite/g++.dg/other/cv_func.C @@ -4,7 +4,6 @@ typedef int FIC(int) const; typedef int FI(int); FIC f; // { dg-error "qualified" } -// { dg-error "ignoring" "ignoring" { target *-*-* } 6 } struct S { FIC f; // OK @@ -15,7 +14,7 @@ struct S { }; FIC S::*pm = &S::f; const FI S::*pm2 = &S::f; // { dg-error "qualifier" } -// { dg-error "cannot convert" "cannot convert" { target *-*-* } 17 } +// { dg-error "cannot convert" "cannot convert" { target *-*-* } 16 } const FIC S::*pm3 = &S::f; // { dg-error "qualifier" } int S::f(int) const diff --git a/gcc/testsuite/g++.dg/parse/fn-typedef1.C b/gcc/testsuite/g++.dg/parse/fn-typedef1.C new file mode 100644 index 00000000000..6cc862583f4 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/fn-typedef1.C @@ -0,0 +1,18 @@ +// PR c++/40750 + +extern "C" void abort (); + +typedef void Fn() const; + +struct Foo { + Fn fn; +}; + +bool called = false; +void Foo::fn() const { called = true; } + +int main() { + Foo f; f.fn(); + if (!called) + abort(); +} -- 2.11.0