diff options
author | Paolo Carlini <paolo.carlini@oracle.com> | 2018-07-09 07:59:22 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2018-07-09 07:59:22 +0000 |
commit | 7b3bc05474bb87c6e7f786f528f82b9de3429203 (patch) | |
tree | 86a22a457750776ff45941561c4b1f80a42fccae /gcc | |
parent | 1dc9cf5d9fec61fd0bd32f7e4026f5e259d3e016 (diff) | |
download | gcc-7b3bc05474bb87c6e7f786f528f82b9de3429203.zip gcc-7b3bc05474bb87c6e7f786f528f82b9de3429203.tar.gz gcc-7b3bc05474bb87c6e7f786f528f82b9de3429203.tar.bz2 |
decl.c (grokdeclarator): Use rich_location::add_range in three more places; include gcc-rich-location.h.
/cp
2018-07-09 Paolo Carlini <paolo.carlini@oracle.com>
* decl.c (grokdeclarator): Use rich_location::add_range in three
more places; include gcc-rich-location.h.
/testsuite
2018-07-09 Paolo Carlini <paolo.carlini@oracle.com>
* 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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/decl.c | 23 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/diagnostic/long-short.C | 12 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/diagnostic/signed-unsigned.C | 12 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/diagnostic/virtual-friend.C | 16 | ||||
-rw-r--r-- | gcc/testsuite/g++.old-deja/g++.brendan/crash11.C | 4 |
7 files changed, 71 insertions, 8 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 9fb2b48..82cb481 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2018-07-09 Paolo Carlini <paolo.carlini@oracle.com> + + * decl.c (grokdeclarator): Use rich_location::add_range in three + more places; include gcc-rich-location.h. + 2018-07-07 Aldy Hernandez <aldyh@redhat.com> * decl.c (build_enumerator): Change overflow type to overflow_type. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index c879e8f..3597ba0 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, "%<signed%> and %<unsigned%> specified together"); + { + gcc_rich_location richloc (declspecs->locations[ds_signed]); + richloc.add_range (declspecs->locations[ds_unsigned], false); + error_at (&richloc, + "%<signed%> and %<unsigned%> specified together"); + } else if (long_p && short_p) - error_at (loc, "%<long%> and %<short%> specified together"); + { + gcc_rich_location richloc (declspecs->locations[ds_long]); + richloc.add_range (declspecs->locations[ds_short], false); + error_at (&richloc, "%<long%> and %<short%> 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 %<virtual%> " "and %<static%>", 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 %<virtual%> " "and %<constexpr%>", 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 988fac1..dae26a2 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2018-07-09 Paolo Carlini <paolo.carlini@oracle.com> + + * 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 <tdevries@suse.de> * 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 0000000..af82b37 --- /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 0000000..614783c --- /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 0000000..c4f72bf --- /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 246f5a0..96ebb71 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 } }; |