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
This commit is contained in:
parent
feac22a782
commit
38b69a9c11
6 changed files with 37 additions and 9 deletions
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
6
gcc/testsuite/g++.dg/cpp0x/constexpr-virtual5.C
Normal file
6
gcc/testsuite/g++.dg/cpp0x/constexpr-virtual5.C
Normal file
|
@ -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'" }
|
||||
};
|
|
@ -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" }
|
||||
};
|
||||
|
|
|
@ -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" }
|
||||
};
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue