From eda42c4f3c1d39590277fb33309e95af8baf8062 Mon Sep 17 00:00:00 2001 From: Ville Voutilainen Date: Sat, 23 Jul 2011 00:05:58 +0300 Subject: [PATCH] Warn about the use of final/override in non-c++0x mode, and add __final for non-c++0x mode. Warn about the use of final/override in non-c++0x mode, and add __final for non-c++0x mode. * cp-tree.h (cpp0x_warn_str): Add CPP0X_OVERRIDE_CONTROLS. * error.c (maybe_warn_cpp0x): Adjust. * parser.c (cp_parser_virt_specifier_seq_opt): Use it. Add '__final' as a non-c++0x alternative for 'final'. From-SVN: r176655 --- gcc/cp/ChangeLog | 9 +++++++++ gcc/cp/cp-tree.h | 4 +++- gcc/cp/error.c | 5 +++++ gcc/cp/parser.c | 14 ++++++++++++-- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/cpp0x/override1.C | 1 + gcc/testsuite/g++.dg/cpp0x/override3.C | 24 ++++++++++++++++++++++++ 7 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/override3.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 49faf152ae3..cdbb3fe5ecb 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,12 @@ +2011-07-22 Ville Voutilainen + + Warn about the use of final/override in non-c++0x mode, and + add __final for non-c++0x mode. + * cp-tree.h (cpp0x_warn_str): Add CPP0X_OVERRIDE_CONTROLS. + * error.c (maybe_warn_cpp0x): Adjust. + * parser.c (cp_parser_virt_specifier_seq_opt): Use it. Add + '__final' as a non-c++0x alternative for 'final'. + 2011-07-22 Jason Merrill Mark Glisse diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index c5905850ca4..fb171782cd7 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -393,7 +393,9 @@ typedef enum cpp0x_warn_str /* defaulted and deleted functions */ CPP0X_DEFAULTED_DELETED, /* inline namespaces */ - CPP0X_INLINE_NAMESPACES + CPP0X_INLINE_NAMESPACES, + /* override controls, override/final */ + CPP0X_OVERRIDE_CONTROLS } cpp0x_warn_str; /* The various kinds of operation used by composite_pointer_type. */ diff --git a/gcc/cp/error.c b/gcc/cp/error.c index 2d7c0f1f0b6..d435bbe9fce 100644 --- a/gcc/cp/error.c +++ b/gcc/cp/error.c @@ -3227,6 +3227,11 @@ maybe_warn_cpp0x (cpp0x_warn_str str) "inline namespaces " "only available with -std=c++0x or -std=gnu++0x"); break; + case CPP0X_OVERRIDE_CONTROLS: + pedwarn (input_location, 0, + "override controls (override/final) " + "only available with -std=c++0x or -std=gnu++0x"); + break; default: gcc_unreachable(); } diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 285180152e3..dc54dc20d80 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -15596,9 +15596,19 @@ cp_parser_virt_specifier_seq_opt (cp_parser* parser) if (token->type != CPP_NAME) break; if (!strcmp (IDENTIFIER_POINTER(token->u.value), "override")) - virt_specifier = VIRT_SPEC_OVERRIDE; + { + maybe_warn_cpp0x (CPP0X_OVERRIDE_CONTROLS); + virt_specifier = VIRT_SPEC_OVERRIDE; + } else if (!strcmp (IDENTIFIER_POINTER(token->u.value), "final")) - virt_specifier = VIRT_SPEC_FINAL; + { + maybe_warn_cpp0x (CPP0X_OVERRIDE_CONTROLS); + virt_specifier = VIRT_SPEC_FINAL; + } + else if (!strcmp (IDENTIFIER_POINTER(token->u.value), "__final")) + { + virt_specifier = VIRT_SPEC_FINAL; + } else break; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 5bf85f5b2e1..ec8a8e0fbae 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-07-22 Ville Voutilainen + + * override1.C: This test should use c++0x mode. + * override3.C: New. Test the diagnostics in c++98 mode. + 2011-07-22 Jason Merrill Mark Glisse diff --git a/gcc/testsuite/g++.dg/cpp0x/override1.C b/gcc/testsuite/g++.dg/cpp0x/override1.C index 83e04790873..ba580b5c09f 100644 --- a/gcc/testsuite/g++.dg/cpp0x/override1.C +++ b/gcc/testsuite/g++.dg/cpp0x/override1.C @@ -1,4 +1,5 @@ // { dg-do compile } +// { dg-options "--std=c++0x" } struct B { virtual void f() final {} diff --git a/gcc/testsuite/g++.dg/cpp0x/override3.C b/gcc/testsuite/g++.dg/cpp0x/override3.C new file mode 100644 index 00000000000..2d22cbf2aa7 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/override3.C @@ -0,0 +1,24 @@ +// { dg-do compile } +// { dg-options "--std=c++98" } + +struct B final {}; // { dg-warning "override controls" } + +struct D : B {}; // { dg-error "cannot derive from 'final' base" } + +struct E __final {}; + +struct F : E {}; // { dg-error "cannot derive from 'final' base" } + +struct G +{ + virtual void f(); +}; + +struct H : G +{ + void f() override; // { dg-warning "override controls" } +}; + +int main() +{ +} -- 2.30.2