From 7b3bc05474bb87c6e7f786f528f82b9de3429203 Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Mon, 9 Jul 2018 07:59:22 +0000 Subject: [PATCH] decl.c (grokdeclarator): Use rich_location::add_range in three more places; include gcc-rich-location.h. /cp 2018-07-09 Paolo Carlini * decl.c (grokdeclarator): Use rich_location::add_range in three more places; include gcc-rich-location.h. /testsuite 2018-07-09 Paolo Carlini * g++.dg/diagnostic/long-short.C: New. * g++.dg/diagnostic/signed-unsigned.C: Likewise. * g++.dg/diagnostic/virtual-friend.C: Likewise. * g++.old-deja/g++.brendan/crash11.C: Adjust. From-SVN: r262512 --- gcc/cp/ChangeLog | 5 ++++ gcc/cp/decl.c | 23 ++++++++++++++----- gcc/testsuite/ChangeLog | 7 ++++++ gcc/testsuite/g++.dg/diagnostic/long-short.C | 12 ++++++++++ .../g++.dg/diagnostic/signed-unsigned.C | 12 ++++++++++ .../g++.dg/diagnostic/virtual-friend.C | 16 +++++++++++++ .../g++.old-deja/g++.brendan/crash11.C | 4 ++-- 7 files changed, 71 insertions(+), 8 deletions(-) create mode 100644 gcc/testsuite/g++.dg/diagnostic/long-short.C create mode 100644 gcc/testsuite/g++.dg/diagnostic/signed-unsigned.C create mode 100644 gcc/testsuite/g++.dg/diagnostic/virtual-friend.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 9fb2b48f64c..82cb481ff77 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2018-07-09 Paolo Carlini + + * decl.c (grokdeclarator): Use rich_location::add_range in three + more places; include gcc-rich-location.h. + 2018-07-07 Aldy Hernandez * decl.c (build_enumerator): Change overflow type to overflow_type. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index c879e8f8f3f..3597ba04654 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -51,6 +51,7 @@ along with GCC; see the file COPYING3. If not see #include "builtins.h" #include "gimplify.h" #include "asan.h" +#include "gcc-rich-location.h" /* Possible cases of bad specifiers type used by bad_specifiers. */ enum bad_spec_place { @@ -10580,9 +10581,18 @@ grokdeclarator (const cp_declarator *declarator, int ok = 0; if (signed_p && unsigned_p) - error_at (loc, "% and % specified together"); + { + gcc_rich_location richloc (declspecs->locations[ds_signed]); + richloc.add_range (declspecs->locations[ds_unsigned], false); + error_at (&richloc, + "% and % specified together"); + } else if (long_p && short_p) - error_at (loc, "% and % specified together"); + { + gcc_rich_location richloc (declspecs->locations[ds_long]); + richloc.add_range (declspecs->locations[ds_short], false); + error_at (&richloc, "% and % specified together"); + } else if (TREE_CODE (type) != INTEGER_TYPE || type == char16_type_node || type == char32_type_node || ((long_p || short_p) @@ -10723,7 +10733,7 @@ grokdeclarator (const cp_declarator *declarator, { if (staticp == 2) { - rich_location richloc (line_table, declspecs->locations[ds_virtual]); + gcc_rich_location richloc (declspecs->locations[ds_virtual]); richloc.add_range (declspecs->locations[ds_storage_class], false); error_at (&richloc, "member %qD cannot be declared both % " "and %", dname); @@ -10732,7 +10742,7 @@ grokdeclarator (const cp_declarator *declarator, } if (constexpr_p) { - rich_location richloc (line_table, declspecs->locations[ds_virtual]); + gcc_rich_location richloc (declspecs->locations[ds_virtual]); richloc.add_range (declspecs->locations[ds_constexpr], false); error_at (&richloc, "member %qD cannot be declared both % " "and %", dname); @@ -11270,8 +11280,9 @@ grokdeclarator (const cp_declarator *declarator, if (virtualp) { /* Cannot be both friend and virtual. */ - error_at (declspecs->locations[ds_friend], - "virtual functions cannot be friends"); + gcc_rich_location richloc (declspecs->locations[ds_virtual]); + richloc.add_range (declspecs->locations[ds_friend], false); + error_at (&richloc, "virtual functions cannot be friends"); friendp = 0; } if (decl_context == NORMAL) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 988fac11b05..dae26a2e97d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2018-07-09 Paolo Carlini + + * g++.dg/diagnostic/long-short.C: New. + * g++.dg/diagnostic/signed-unsigned.C: Likewise. + * g++.dg/diagnostic/virtual-friend.C: Likewise. + * g++.old-deja/g++.brendan/crash11.C: Adjust. + 2018-07-09 Tom de Vries * gcc.dg/vla-1.c: New test. diff --git a/gcc/testsuite/g++.dg/diagnostic/long-short.C b/gcc/testsuite/g++.dg/diagnostic/long-short.C new file mode 100644 index 00000000000..af82b37b113 --- /dev/null +++ b/gcc/testsuite/g++.dg/diagnostic/long-short.C @@ -0,0 +1,12 @@ +// { dg-options "-fdiagnostics-show-caret" } + +long short int a; // { dg-error "1:.long. and .short. specified together" } +/* { dg-begin-multiline-output "" } + long short int a; + ^~~~ ~~~~~ + { dg-end-multiline-output "" } */ +short long int b; // { dg-error "7:.long. and .short. specified together" } +/* { dg-begin-multiline-output "" } + short long int b; + ~~~~~ ^~~~ + { dg-end-multiline-output "" } */ diff --git a/gcc/testsuite/g++.dg/diagnostic/signed-unsigned.C b/gcc/testsuite/g++.dg/diagnostic/signed-unsigned.C new file mode 100644 index 00000000000..614783ce7a0 --- /dev/null +++ b/gcc/testsuite/g++.dg/diagnostic/signed-unsigned.C @@ -0,0 +1,12 @@ +// { dg-options "-fdiagnostics-show-caret" } + +signed unsigned int a; // { dg-error "1:.signed. and .unsigned. specified together" } +/* { dg-begin-multiline-output "" } + signed unsigned int a; + ^~~~~~ ~~~~~~~~ + { dg-end-multiline-output "" } */ +unsigned signed int b; // { dg-error "10:.signed. and .unsigned. specified together" } +/* { dg-begin-multiline-output "" } + unsigned signed int b; + ~~~~~~~~ ^~~~~~ + { dg-end-multiline-output "" } */ diff --git a/gcc/testsuite/g++.dg/diagnostic/virtual-friend.C b/gcc/testsuite/g++.dg/diagnostic/virtual-friend.C new file mode 100644 index 00000000000..c4f72bf4db7 --- /dev/null +++ b/gcc/testsuite/g++.dg/diagnostic/virtual-friend.C @@ -0,0 +1,16 @@ +// { dg-options "-fdiagnostics-show-caret" } +// { dg-do compile { target c++11 } } + +struct S +{ + virtual friend void foo(); // { dg-error "3:virtual functions cannot be friends" } +/* { dg-begin-multiline-output "" } + virtual friend void foo(); + ^~~~~~~ ~~~~~~ + { dg-end-multiline-output "" } */ + friend virtual void bar(); // { dg-error "10:virtual functions cannot be friends" } +/* { dg-begin-multiline-output "" } + friend virtual void bar(); + ~~~~~~ ^~~~~~~ + { dg-end-multiline-output "" } */ +}; diff --git a/gcc/testsuite/g++.old-deja/g++.brendan/crash11.C b/gcc/testsuite/g++.old-deja/g++.brendan/crash11.C index 246f5a03aa5..96ebb71645c 100644 --- a/gcc/testsuite/g++.old-deja/g++.brendan/crash11.C +++ b/gcc/testsuite/g++.old-deja/g++.brendan/crash11.C @@ -9,13 +9,13 @@ class A { int h; A() { i=10; j=20; } virtual void f1() { printf("i=%d j=%d\n",i,j); } - friend virtual void f2() { printf("i=%d j=%d\n",i,j); } // { dg-error "2:virtual functions cannot be friends" } + friend virtual void f2() { printf("i=%d j=%d\n",i,j); } // { dg-error "9:virtual functions cannot be friends" } }; class B : public A { public: virtual void f1() { printf("i=%d j=%d\n",i,j); }// { dg-error "" } member.*// ERROR - member.* - friend virtual void f2() { printf("i=%d j=%d\n",i,j); } // { dg-error "2:virtual functions cannot be friends" } + friend virtual void f2() { printf("i=%d j=%d\n",i,j); } // { dg-error "9:virtual functions cannot be friends" } // { dg-error "private" "" { target *-*-* } .-1 } }; -- 2.30.2