aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/decl.c
diff options
context:
space:
mode:
authorMarek Polacek <polacek@redhat.com>2021-11-22 14:09:25 -0500
committerMarek Polacek <polacek@redhat.com>2021-11-24 00:22:10 -0500
commitd71d019f63ed5d3fdb34579023bafa4dcf323f2c (patch)
tree21384cd37c5ec8783cd0e7463c81c87f7f12c9eb /gcc/cp/decl.c
parent9bf69a8558638ce0cdd69e83a68776deb9b8e053 (diff)
downloadgcc-d71d019f63ed5d3fdb34579023bafa4dcf323f2c.zip
gcc-d71d019f63ed5d3fdb34579023bafa4dcf323f2c.tar.gz
gcc-d71d019f63ed5d3fdb34579023bafa4dcf323f2c.tar.bz2
c++: Fix missing NSDMI diagnostic in C++98 [PR103347]
Here the problem is that we aren't detecting a NSDMI in C++98: struct A { void *x = NULL; }; because maybe_warn_cpp0x uses input_location and that happens to point to NULL which comes from a system header. Jakub suggested changing the location to the '=', thereby avoiding the system header problem. To that end, I've added a new location_t member into cp_declarator. This member is used when this declarator is part of an init-declarator. The rest of the changes is obvious. I've also taken the liberty of adding loc_or_input_loc, since I want to avoid checking for UNKNOWN_LOCATION. PR c++/103347 gcc/cp/ChangeLog: * cp-tree.h (struct cp_declarator): Add a location_t member. (maybe_warn_cpp0x): Add a location_t parameter with a default argument. (loc_or_input_loc): New. * decl.c (grokdeclarator): Use loc_or_input_loc. Pass init_loc down to maybe_warn_cpp0x. * error.c (maybe_warn_cpp0x): Add a location_t parameter. Use it. * parser.c (make_declarator): Initialize init_loc. (cp_parser_member_declaration): Set init_loc. (cp_parser_condition): Likewise. (cp_parser_init_declarator): Likewise. (cp_parser_parameter_declaration): Likewise. gcc/testsuite/ChangeLog: * g++.dg/cpp0x/nsdmi-warn1.C: New test. * g++.dg/cpp0x/nsdmi-warn1.h: New file.
Diffstat (limited to 'gcc/cp/decl.c')
-rw-r--r--gcc/cp/decl.c22
1 files changed, 13 insertions, 9 deletions
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 375079f..588094b 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -11507,14 +11507,18 @@ grokdeclarator (const cp_declarator *declarator,
if (initialized == SD_DEFAULTED || initialized == SD_DELETED)
funcdef_flag = true;
- location_t typespec_loc = smallest_type_location (type_quals,
- declspecs->locations);
- if (typespec_loc == UNKNOWN_LOCATION)
- typespec_loc = input_location;
-
- location_t id_loc = declarator ? declarator->id_loc : input_location;
- if (id_loc == UNKNOWN_LOCATION)
- id_loc = input_location;
+ location_t typespec_loc = loc_or_input_loc (smallest_type_location
+ (type_quals,
+ declspecs->locations));
+ location_t id_loc;
+ location_t init_loc;
+ if (declarator)
+ {
+ id_loc = loc_or_input_loc (declarator->id_loc);
+ init_loc = loc_or_input_loc (declarator->init_loc);
+ }
+ else
+ init_loc = id_loc = input_location;
/* Look inside a declarator for the name being declared
and get it as a string, for an error message. */
@@ -14027,7 +14031,7 @@ grokdeclarator (const cp_declarator *declarator,
{
/* An attempt is being made to initialize a non-static
member. This is new in C++11. */
- maybe_warn_cpp0x (CPP0X_NSDMI);
+ maybe_warn_cpp0x (CPP0X_NSDMI, init_loc);
/* If this has been parsed with static storage class, but
errors forced staticp to be cleared, ensure NSDMI is