diff options
author | Jan Kratochvil <jan.kratochvil@redhat.com> | 2015-07-08 14:42:19 +0200 |
---|---|---|
committer | Jan Kratochvil <jan.kratochvil@redhat.com> | 2015-07-08 14:42:19 +0200 |
commit | 084641963dba63283bf2eca227f4f77c2598b172 (patch) | |
tree | 2e5715e2ac8d9a6b01c21e02516f0f00d5718a07 | |
parent | bcf5c1d96b3b5493041002eb2b6d27288d9d160a (diff) | |
download | gdb-084641963dba63283bf2eca227f4f77c2598b172.zip gdb-084641963dba63283bf2eca227f4f77c2598b172.tar.gz gdb-084641963dba63283bf2eca227f4f77c2598b172.tar.bz2 |
compile: Warn for old GCC on cv-qualified self-reference
GDB could:
compile code struct_object.selffield = &struct_object
./compile/compile-c-types.c:83: internal-error: insert_type: Assertion `add == NULL || add->gcc_type == gcc_type' failed.
A problem internal to GDB has been detected,
further debugging may prove unreliable.
Quit this debugging session? (y or n) FAIL: gdb.compile/compile.exp: compile code struct_object.selffield = &struct_object (GDB internal
error)
The bug was not in GDB but in the GCC part interfacing with GDB.
Alexandre Oliva has fixed it the right way:
https://gcc.gnu.org/git/gitweb.cgi?p=gcc.git;a=commitdiff;h=072dfdba0ea62abb65514cb3a90cdf3868efe286
git://gcc.gnu.org/git/gcc.git
aoliva/libcp1
Attaching this GDB testsuite update + info to user s/he should upgrade GCC.
After Alex upstreams the fix I can update the message to contain the specific
GCC release.
gdb/ChangeLog
2015-07-08 Jan Kratochvil <jan.kratochvil@redhat.com>
PR compile/18484
* compile/compile-c-types.c (insert_type): Change gdb_assert to error.
gdb/testsuite/ChangeLog
2015-07-08 Jan Kratochvil <jan.kratochvil@redhat.com>
PR compile/18484
* gdb.compile/compile.c (struct struct_type): Add volatile to
selffield's type.
* gdb.compile/compile.exp
(compile code struct_object.selffield = &struct_object): Skip further
struct_object tests if this one xfails.
-rw-r--r-- | gdb/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/compile/compile-c-types.c | 3 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 9 | ||||
-rw-r--r-- | gdb/testsuite/gdb.compile/compile.c | 2 | ||||
-rw-r--r-- | gdb/testsuite/gdb.compile/compile.exp | 76 |
5 files changed, 60 insertions, 35 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 723ed2c..b565dde 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2015-07-08 Jan Kratochvil <jan.kratochvil@redhat.com> + + PR compile/18484 + * compile/compile-c-types.c (insert_type): Change gdb_assert to error. + 2015-07-08 Robert O'Callahan <robert@ocallahan.org> PR exp/18617 diff --git a/gdb/compile/compile-c-types.c b/gdb/compile/compile-c-types.c index 22f5a9d..1ad3dd9 100644 --- a/gdb/compile/compile-c-types.c +++ b/gdb/compile/compile-c-types.c @@ -78,7 +78,8 @@ insert_type (struct compile_c_instance *context, struct type *type, add = *slot; /* The type might have already been inserted in order to handle recursive types. */ - gdb_assert (add == NULL || add->gcc_type == gcc_type); + if (add != NULL && add->gcc_type != gcc_type) + error (_("Unexpected type id from GCC, check you use recent enough GCC.")); if (add == NULL) { diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 285bf2c..fe6fddc 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,12 @@ +2015-07-08 Jan Kratochvil <jan.kratochvil@redhat.com> + + PR compile/18484 + * gdb.compile/compile.c (struct struct_type): Add volatile to + selffield's type. + * gdb.compile/compile.exp + (compile code struct_object.selffield = &struct_object): Skip further + struct_object tests if this one xfails. + 2015-07-08 Robert O'Callahan <robert@ocallahan.org> PR exp/18617 diff --git a/gdb/testsuite/gdb.compile/compile.c b/gdb/testsuite/gdb.compile/compile.c index 3d5f20a..41ff087 100644 --- a/gdb/testsuite/gdb.compile/compile.c +++ b/gdb/testsuite/gdb.compile/compile.c @@ -42,7 +42,7 @@ struct struct_type { float floatfield; double doublefield; const union union_type *ptrfield; - struct struct_type *selffield; + volatile struct struct_type *selffield; int arrayfield[5]; _Complex double complexfield; _Bool boolfield; diff --git a/gdb/testsuite/gdb.compile/compile.exp b/gdb/testsuite/gdb.compile/compile.exp index dd46a5f..a416e9e 100644 --- a/gdb/testsuite/gdb.compile/compile.exp +++ b/gdb/testsuite/gdb.compile/compile.exp @@ -189,51 +189,61 @@ gdb_test "p localvar" " = 1" # Test setting fields and also many different types. # +set skip_struct_object 0 set test "compile code struct_object.selffield = &struct_object" gdb_test_multiple $test $test { -re "^$test\r\n$gdb_prompt $" { pass "$test" } - -re "gdb command line:1:25: warning: assignment discards 'volatile' qualifier from pointer target type \\\[-Wdiscarded-qualifiers\\\]\r\n$gdb_prompt $" { + -re " error: Unexpected type id from GCC, check you use recent enough GCC\\.\r\n.*\r\n$gdb_prompt $" { xfail "$test (PR compile/18202)" + + # All following tests will break with the same error message. + set skip_struct_object 1 } } -gdb_test "print struct_object.selffield == &struct_object" " = 1" - -gdb_test_no_output "compile code struct_object.charfield = 1" -gdb_test "print struct_object.charfield" " = 1 '\\\\001'" -gdb_test_no_output "compile code struct_object.ucharfield = 1" -gdb_test "print struct_object.ucharfield" " = 1 '\\\\001'" - -foreach {field value} { - shortfield -5 - ushortfield 5 - intfield -7 - uintfield 7 - bitfield 2 - longfield -9 - ulongfield 9 - enumfield ONE - floatfield 1 - doublefield 2 -} { - gdb_test_no_output "compile code struct_object.$field = $value" - gdb_test "print struct_object.$field" " = $value" -} -gdb_test_no_output "compile code struct_object.arrayfield\[2\] = 7" -gdb_test "print struct_object.arrayfield" \ - " = \\{0, 0, 7, 0, 0\\}" +if {$skip_struct_object} { + untested "all struct_object tests" +} else { + gdb_test "print struct_object.selffield == &struct_object" " = 1" + + gdb_test_no_output "compile code struct_object.charfield = 1" + gdb_test "print struct_object.charfield" " = 1 '\\\\001'" + gdb_test_no_output "compile code struct_object.ucharfield = 1" + gdb_test "print struct_object.ucharfield" " = 1 '\\\\001'" + + foreach {field value} { + shortfield -5 + ushortfield 5 + intfield -7 + uintfield 7 + bitfield 2 + longfield -9 + ulongfield 9 + enumfield ONE + floatfield 1 + doublefield 2 + } { + gdb_test_no_output "compile code struct_object.$field = $value" + gdb_test "print struct_object.$field" " = $value" + } -gdb_test_no_output "compile code struct_object.complexfield = 7 + 5i" -gdb_test "print struct_object.complexfield" " = 7 \\+ 5 \\* I" + gdb_test_no_output "compile code struct_object.arrayfield\[2\] = 7" + gdb_test "print struct_object.arrayfield" \ + " = \\{0, 0, 7, 0, 0\\}" -gdb_test_no_output "compile code struct_object.boolfield = 1" -gdb_test "print struct_object.boolfield" " = true" + gdb_test_no_output "compile code struct_object.complexfield = 7 + 5i" + gdb_test "print struct_object.complexfield" " = 7 \\+ 5 \\* I" -gdb_test_no_output "compile code struct_object.vectorfield\[2\] = 7" -gdb_test "print struct_object.vectorfield" \ - " = \\{0, 0, 7, 0\\}" + gdb_test_no_output "compile code struct_object.boolfield = 1" + gdb_test "print struct_object.boolfield" " = true" + + gdb_test_no_output "compile code struct_object.vectorfield\[2\] = 7" + gdb_test "print struct_object.vectorfield" \ + " = \\{0, 0, 7, 0\\}" + +} gdb_test_no_output "compile code union_object.typedeffield = 7" gdb_test "print union_object.typedeffield" " = 7" |