summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Kratochvil <jan.kratochvil@redhat.com>2015-07-08 14:42:19 +0200
committerJan Kratochvil <jan.kratochvil@redhat.com>2015-07-08 14:42:19 +0200
commit084641963dba63283bf2eca227f4f77c2598b172 (patch)
tree2e5715e2ac8d9a6b01c21e02516f0f00d5718a07
parentbcf5c1d96b3b5493041002eb2b6d27288d9d160a (diff)
downloadbinutils-gdb-084641963dba63283bf2eca227f4f77c2598b172.tar.gz
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/ChangeLog5
-rw-r--r--gdb/compile/compile-c-types.c3
-rw-r--r--gdb/testsuite/ChangeLog9
-rw-r--r--gdb/testsuite/gdb.compile/compile.c2
-rw-r--r--gdb/testsuite/gdb.compile/compile.exp76
5 files changed, 60 insertions, 35 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 723ed2ca1ab..b565dde9e78 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 22f5a9d8399..1ad3dd9b77a 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 285bf2cf6be..fe6fddc8a1a 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 3d5f20a7b6f..41ff087df76 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 dd46a5fac55..a416e9ee902 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"