Commit 7b3bc054 by Paolo Carlini Committed by Paolo Carlini

decl.c (grokdeclarator): Use rich_location::add_range in three more places;…

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
parent 1dc9cf5d
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> 2018-07-07 Aldy Hernandez <aldyh@redhat.com>
* decl.c (build_enumerator): Change overflow type to overflow_type. * decl.c (build_enumerator): Change overflow type to overflow_type.
......
...@@ -51,6 +51,7 @@ along with GCC; see the file COPYING3. If not see ...@@ -51,6 +51,7 @@ along with GCC; see the file COPYING3. If not see
#include "builtins.h" #include "builtins.h"
#include "gimplify.h" #include "gimplify.h"
#include "asan.h" #include "asan.h"
#include "gcc-rich-location.h"
/* Possible cases of bad specifiers type used by bad_specifiers. */ /* Possible cases of bad specifiers type used by bad_specifiers. */
enum bad_spec_place { enum bad_spec_place {
...@@ -10580,9 +10581,18 @@ grokdeclarator (const cp_declarator *declarator, ...@@ -10580,9 +10581,18 @@ grokdeclarator (const cp_declarator *declarator,
int ok = 0; int ok = 0;
if (signed_p && unsigned_p) 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) 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 else if (TREE_CODE (type) != INTEGER_TYPE
|| type == char16_type_node || type == char32_type_node || type == char16_type_node || type == char32_type_node
|| ((long_p || short_p) || ((long_p || short_p)
...@@ -10723,7 +10733,7 @@ grokdeclarator (const cp_declarator *declarator, ...@@ -10723,7 +10733,7 @@ grokdeclarator (const cp_declarator *declarator,
{ {
if (staticp == 2) 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); richloc.add_range (declspecs->locations[ds_storage_class], false);
error_at (&richloc, "member %qD cannot be declared both %<virtual%> " error_at (&richloc, "member %qD cannot be declared both %<virtual%> "
"and %<static%>", dname); "and %<static%>", dname);
...@@ -10732,7 +10742,7 @@ grokdeclarator (const cp_declarator *declarator, ...@@ -10732,7 +10742,7 @@ grokdeclarator (const cp_declarator *declarator,
} }
if (constexpr_p) 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); richloc.add_range (declspecs->locations[ds_constexpr], false);
error_at (&richloc, "member %qD cannot be declared both %<virtual%> " error_at (&richloc, "member %qD cannot be declared both %<virtual%> "
"and %<constexpr%>", dname); "and %<constexpr%>", dname);
...@@ -11270,8 +11280,9 @@ grokdeclarator (const cp_declarator *declarator, ...@@ -11270,8 +11280,9 @@ grokdeclarator (const cp_declarator *declarator,
if (virtualp) if (virtualp)
{ {
/* Cannot be both friend and virtual. */ /* Cannot be both friend and virtual. */
error_at (declspecs->locations[ds_friend], gcc_rich_location richloc (declspecs->locations[ds_virtual]);
"virtual functions cannot be friends"); richloc.add_range (declspecs->locations[ds_friend], false);
error_at (&richloc, "virtual functions cannot be friends");
friendp = 0; friendp = 0;
} }
if (decl_context == NORMAL) if (decl_context == NORMAL)
......
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> 2018-07-09 Tom de Vries <tdevries@suse.de>
* gcc.dg/vla-1.c: New test. * gcc.dg/vla-1.c: New test.
......
// { 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 "" } */
// { 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 "" } */
// { 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 "" } */
};
...@@ -9,13 +9,13 @@ class A { ...@@ -9,13 +9,13 @@ class A {
int h; int h;
A() { i=10; j=20; } A() { i=10; j=20; }
virtual void f1() { printf("i=%d j=%d\n",i,j); } 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 { class B : public A {
public: public:
virtual void f1() { printf("i=%d j=%d\n",i,j); }// { dg-error "" } member.*// ERROR - member.* 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 } // { dg-error "private" "" { target *-*-* } .-1 }
}; };
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment