diff options
author | Pedro Alves <pedro@palves.net> | 2022-06-17 11:10:40 +0100 |
---|---|---|
committer | Pedro Alves <pedro@palves.net> | 2022-06-17 11:39:57 +0100 |
commit | dfea48fc0f040e87c5d7d4fc34c0610dc0039ad1 (patch) | |
tree | 28800394fccffea283142330be810f4edaae8535 /gdb/linespec.c | |
parent | dac9773e17261f905d51684fe35da036e82c69cd (diff) | |
download | gdb-dfea48fc0f040e87c5d7d4fc34c0610dc0039ad1.zip gdb-dfea48fc0f040e87c5d7d4fc34c0610dc0039ad1.tar.gz gdb-dfea48fc0f040e87c5d7d4fc34c0610dc0039ad1.tar.bz2 |
Fix GDB build with GCC 4.8 & 4.9
With gcc 4.8/4.9, we run into this build failure (and other similar
ones):
/home/palves/gdb/binutils-gdb/src/gdb/location.h:224:59: error: could not convert ‘{0, LINE_OFFSET_UNKNOWN}’ from ‘<brace-enclosed initializer list>’ to ‘line_offset’
struct line_offset line_offset = {0, LINE_OFFSET_UNKNOWN};
^
The issue is that at around the GCC 4.8/4.9 era, a default member
initializer prevented the struct from being an aggregate, so you
cannot use aggregate initialization on them. That rule changed after
GCC 4.9 and GCC 5 & later uses new rules.
Fix this by not using aggregate initialization for struct line_offset.
The default member initization already leaves line_offset as {0,
LINE_OFFSET_UNKNOWN}, so initialization to those values can just go
away. The remaining cases are of the form {0, LINE_OFFSET_NONE}, and
those cases can be better rewritten to delay setting the sign field
until we know we have a valid offset.
Change-Id: I0506ea4a83c5fa2f15e159569db68b3b0a7509b4
Diffstat (limited to 'gdb/linespec.c')
-rw-r--r-- | gdb/linespec.c | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/gdb/linespec.c b/gdb/linespec.c index 10dca95..3db3599 100644 --- a/gdb/linespec.c +++ b/gdb/linespec.c @@ -1662,7 +1662,7 @@ struct line_offset linespec_parse_line_offset (const char *string) { const char *start = string; - struct line_offset line_offset = {0, LINE_OFFSET_NONE}; + struct line_offset line_offset; if (*string == '+') { @@ -1674,6 +1674,8 @@ linespec_parse_line_offset (const char *string) line_offset.sign = LINE_OFFSET_MINUS; ++string; } + else + line_offset.sign = LINE_OFFSET_NONE; if (*string != '\0' && !isdigit (*string)) error (_("malformed line offset: \"%s\""), start); @@ -2844,7 +2846,7 @@ linespec_complete_label (completion_tracker &tracker, { linespec_parser parser (0, language, NULL, NULL, 0, NULL); - line_offset unknown_offset = { 0, LINE_OFFSET_UNKNOWN }; + line_offset unknown_offset; try { @@ -4062,7 +4064,7 @@ linespec_parse_variable (struct linespec_state *self, const char *variable) { int index = 0; const char *p; - struct line_offset offset = {0, LINE_OFFSET_NONE}; + line_offset offset; p = (variable[1] == '$') ? variable + 2 : variable + 1; if (*p == '$') @@ -4081,6 +4083,7 @@ linespec_parse_variable (struct linespec_state *self, const char *variable) error (_("History values used in line " "specs must have integer values.")); offset.offset = value_as_long (val_history); + offset.sign = LINE_OFFSET_NONE; } else { @@ -4092,11 +4095,10 @@ linespec_parse_variable (struct linespec_state *self, const char *variable) /* Try it as a convenience variable. If it is not a convenience variable, return and allow normal symbol lookup to occur. */ ivar = lookup_only_internalvar (variable + 1); - if (ivar == NULL) - /* No internal variable with that name. Mark the offset - as unknown to allow the name to be looked up as a symbol. */ - offset.sign = LINE_OFFSET_UNKNOWN; - else + /* If there's no internal variable with that name, let the + offset remain as unknown to allow the name to be looked up + as a symbol. */ + if (ivar != nullptr) { /* We found a valid variable name. If it is not an integer, throw an error. */ @@ -4104,7 +4106,10 @@ linespec_parse_variable (struct linespec_state *self, const char *variable) error (_("Convenience variables used in line " "specs must have integer values.")); else - offset.offset = valx; + { + offset.offset = valx; + offset.sign = LINE_OFFSET_NONE; + } } } |