diff options
author | Paolo Carlini <paolo.carlini@oracle.com> | 2015-12-18 18:18:47 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2015-12-18 18:18:47 +0000 |
commit | 38b69a9c114619088740f49cac9a41410fa668c7 (patch) | |
tree | 8752d688bcc94cfc7ab38eefb8f276adaceb03af | |
parent | feac22a7825a7f8d385b1a2c2558d2bb4089548c (diff) | |
download | gcc-38b69a9c114619088740f49cac9a41410fa668c7.zip gcc-38b69a9c114619088740f49cac9a41410fa668c7.tar.gz gcc-38b69a9c114619088740f49cac9a41410fa668c7.tar.bz2 |
re PR c++/67592 (A virtual member function declared constexpr fails to trigger a diagnostic)
/cp
2015-12-18 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/67592
* decl.c (grokdeclarator): Reject constexpr virtual member functions;
in error messages, prefer %<virtual%> and %<constexpr%> to virtual
and constexpr, respectively.
/testsuite
2015-12-18 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/67592
* g++.dg/cpp0x/constexpr-virtual5.C: New.
* g++.dg/cpp0x/pr51463.C: Adjust dg-error string.
* g++.dg/inherit/pure1.C: Likewise.
From-SVN: r231824
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/decl.c | 22 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/constexpr-virtual5.C | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/pr51463.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/inherit/pure1.C | 2 |
6 files changed, 37 insertions, 9 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 89c0a19..d471721 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2015-12-18 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/67592 + * decl.c (grokdeclarator): Reject constexpr virtual member functions; + in error messages, prefer %<virtual%> and %<constexpr%> to virtual + and constexpr, respectively. + 2015-12-18 Patrick Palka <ppalka@gcc.gnu.org> PR c++/68831 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 7d45d4d..a14062b 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -9769,11 +9769,18 @@ grokdeclarator (const cp_declarator *declarator, if (storage_class == sc_static) staticp = 1 + (decl_context == FIELD); - if (virtualp && staticp == 2) + if (virtualp) { - error ("member %qD cannot be declared both virtual and static", dname); - storage_class = sc_none; - staticp = 0; + if (staticp == 2) + { + error ("member %qD cannot be declared both %<virtual%> " + "and %<static%>", dname); + storage_class = sc_none; + staticp = 0; + } + if (constexpr_p) + error ("member %qD cannot be declared both %<virtual%> " + "and %<constexpr%>", dname); } friendp = decl_spec_seq_has_spec_p (declspecs, ds_friend); @@ -10153,7 +10160,8 @@ grokdeclarator (const cp_declarator *declarator, explicitp = 2; if (virtualp) { - permerror (input_location, "constructors cannot be declared virtual"); + permerror (input_location, + "constructors cannot be declared %<virtual%>"); virtualp = 0; } if (decl_context == FIELD @@ -10988,7 +10996,7 @@ grokdeclarator (const cp_declarator *declarator, ARM 9.5 */ if (virtualp && TREE_CODE (ctype) == UNION_TYPE) { - error ("function %qD declared virtual inside a union", + error ("function %qD declared %<virtual%> inside a union", unqualified_id); return error_mark_node; } @@ -10997,7 +11005,7 @@ grokdeclarator (const cp_declarator *declarator, { if (virtualp) { - error ("%qD cannot be declared virtual, since it " + error ("%qD cannot be declared %<virtual%>, since it " "is always static", unqualified_id); virtualp = 0; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 57326d1..dabdcea 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2015-12-18 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/67592 + * g++.dg/cpp0x/constexpr-virtual5.C: New. + * g++.dg/cpp0x/pr51463.C: Adjust dg-error string. + * g++.dg/inherit/pure1.C: Likewise. + 2015-12-18 Jeff Law <law@redhat.com> PR rtl-optimization/49847 diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-virtual5.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-virtual5.C new file mode 100644 index 0000000..895de50 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-virtual5.C @@ -0,0 +1,6 @@ +// PR c+++/67592 +// { dg-do compile { target c++11 } } + +struct S { + constexpr virtual int f() { return 1; } // { dg-error "both 'virtual' and 'constexpr'" } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/pr51463.C b/gcc/testsuite/g++.dg/cpp0x/pr51463.C index 6a57e478..75de47d 100644 --- a/gcc/testsuite/g++.dg/cpp0x/pr51463.C +++ b/gcc/testsuite/g++.dg/cpp0x/pr51463.C @@ -3,5 +3,5 @@ struct A { - static virtual int i = 0; // { dg-error "both virtual and static|declared as" } + static virtual int i = 0; // { dg-error "both 'virtual' and 'static'|declared as" } }; diff --git a/gcc/testsuite/g++.dg/inherit/pure1.C b/gcc/testsuite/g++.dg/inherit/pure1.C index e825f00..99a5767 100644 --- a/gcc/testsuite/g++.dg/inherit/pure1.C +++ b/gcc/testsuite/g++.dg/inherit/pure1.C @@ -9,7 +9,7 @@ struct A { void foo2() = 0; // { dg-error "non-virtual" } static void foo3() = 0; // { dg-error "static member" } - virtual static void foo4() = 0; // { dg-error "both virtual and static" } + virtual static void foo4() = 0; // { dg-error "both 'virtual' and 'static'" } virtual void foo5() = 0; // { dg-error "base class" } }; |