From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-1.mimecast.com (us-smtp-delivery-1.mimecast.com [205.139.110.120]) by sourceware.org (Postfix) with ESMTP id 8067B3857027 for ; Tue, 30 Jun 2020 11:12:40 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 8067B3857027 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-72-AHX-QcOgMve-M7JUGQsF7A-1; Tue, 30 Jun 2020 07:12:38 -0400 X-MC-Unique: AHX-QcOgMve-M7JUGQsF7A-1 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id BAAEC8015CE for ; Tue, 30 Jun 2020 11:12:37 +0000 (UTC) Received: from blade.nx (ovpn-114-100.ams2.redhat.com [10.36.114.100]) by smtp.corp.redhat.com (Postfix) with ESMTP id 643105D9D7 for ; Tue, 30 Jun 2020 11:12:37 +0000 (UTC) Received: from blade.com (localhost [127.0.0.1]) by blade.nx (Postfix) with ESMTP id A92F2816CCA9 for ; Tue, 30 Jun 2020 12:12:36 +0100 (BST) From: Gary Benson To: gdb-patches@sourceware.org Subject: [PATCH] Skip VLA structure field tests when compiling with clang Date: Tue, 30 Jun 2020 12:12:35 +0100 Message-Id: <1593515555-31490-1-git-send-email-gbenson@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=US-ASCII X-Spam-Status: No, score=-14.9 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 30 Jun 2020 11:12:42 -0000 Hi all, Clang fails to compile gdb.base/vla-datatypes.c with the following error: fields must have a constant size: 'variable length array in structure' extension will never be supported. This patch adds preprocessor contitionals to vla-datatypes.c to not compile any code defining or using use VLA structure fields when compiling with clang, and modifies vla-datatypes.exp to skip all tests that require the omitted code as appropriate. Checked on Fedora 31 x86_64, GCC and clang. Ok to commit? Cheers, Gary -- gdb/testsuite/ChangeLog: * gdb.base/vla-datatypes.c (vla_factory): Wrap sections defining and using VLA structure fields with "#if !defined(__clang__)". * gdb.base/vla-datatypes.exp: Skip VLA structure field tests if compiling with clang. --- gdb/testsuite/ChangeLog | 7 +++++ gdb/testsuite/gdb.base/vla-datatypes.c | 8 ++++++ gdb/testsuite/gdb.base/vla-datatypes.exp | 47 ++++++++++++++++++++------------ 3 files changed, 44 insertions(+), 18 deletions(-) diff --git a/gdb/testsuite/gdb.base/vla-datatypes.c b/gdb/testsuite/gdb.base/vla-datatypes.c index 682319f..ce383a1 100644 --- a/gdb/testsuite/gdb.base/vla-datatypes.c +++ b/gdb/testsuite/gdb.base/vla-datatypes.c @@ -46,6 +46,9 @@ struct foo BAR bar_vla[n]; int i; + /* Clang says it will never support variable length arrays in + structures. */ +#if !defined(__clang__) struct vla_struct { int something; @@ -89,6 +92,7 @@ struct foo vla_struct_typedef_struct_member_object.something = n * 2; vla_struct_typedef_struct_member_object.vla_object.something = n * 3; vla_struct_typedef_union_member_object.vla_object.something = n + 1; +#endif /* !defined(__clang__) */ for (i = 0; i < n; i++) { int_vla[i] = i*2; @@ -104,6 +108,7 @@ struct foo foo_vla[i].a = i*2; bar_vla[i].x = i*2; bar_vla[i].y.a = i*2; +#if !defined(__clang__) vla_struct_object.vla_field[i] = i*2; vla_union_object.vla_field[i] = i*2; inner_vla_struct_object.vla_field[i] = i*2; @@ -111,6 +116,7 @@ struct foo = i * 3; vla_struct_typedef_union_member_object.vla_object.vla_field[i] = i * 3 - 1; +#endif /* !defined(__clang__) */ } size_t int_size = sizeof(int_vla); /* vlas_filled */ @@ -124,9 +130,11 @@ struct foo size_t uchar_size = sizeof(unsigned_char_vla); size_t foo_size = sizeof(foo_vla); size_t bar_size = sizeof(bar_vla); +#if !defined(__clang__) size_t vla_struct_object_size = sizeof(vla_struct_object); size_t vla_union_object_size = sizeof(vla_union_object); size_t inner_vla_struct_object_size = sizeof(inner_vla_struct_object); +#endif /* !defined(__clang__) */ return; /* break_end_of_vla_factory */ } diff --git a/gdb/testsuite/gdb.base/vla-datatypes.exp b/gdb/testsuite/gdb.base/vla-datatypes.exp index e8d8457..2924475 100644 --- a/gdb/testsuite/gdb.base/vla-datatypes.exp +++ b/gdb/testsuite/gdb.base/vla-datatypes.exp @@ -15,6 +15,9 @@ standard_testfile +# Clang says it will never support variable length arrays in structures. +set is_clang [test_compiler_info clang*] + if { [prepare_for_testing "failed to prepare" ${testfile} ${srcfile}] } { return -1 } @@ -41,14 +44,16 @@ gdb_test "print foo_vla" \ "\\\{\\\{a = 0\\\}, \\\{a = 2\\\}, \\\{a = 4\\\}, \\\{a = 6\\\}, \\\{a = 8\\\}\\\}" gdb_test "print bar_vla" \ "\\\{\\\{x = 0, y = \\\{a = 0\\\}\\\}, \\\{x = 2, y = \\\{a = 2\\\}\\\}, \\\{x = 4, y = \\\{a = 4\\\}\\\}, \\\{x = 6, y = \\\{a = 6\\\}\\\}, \\\{x = 8, y = \\\{a = 8\\\}\\\}\\\}" -gdb_test "print vla_struct_object" \ - "\\\{something = 5, vla_field = \\\{0, 2, 4, 6, 8\\\}\\\}" -gdb_test "print vla_union_object" \ - "\\\{vla_field = \\\{0, 2, 4, 6, 8\\\}\\\}" -gdb_test "print vla_struct_typedef_struct_member_object" \ - "\\\{something = 10, vla_object = \\\{something = 15, vla_field = \\\{0, 3, 6, 9, 12\\\}\\\}\\\}" -gdb_test "print vla_struct_typedef_union_member_object" \ - "\\\{something = 6, vla_object = \\\{something = 6, vla_field = \\\{-1, 2, 5, 8, 11\\\}\\\}\\\}" +if {!$is_clang} { + gdb_test "print vla_struct_object" \ + "\\\{something = 5, vla_field = \\\{0, 2, 4, 6, 8\\\}\\\}" + gdb_test "print vla_union_object" \ + "\\\{vla_field = \\\{0, 2, 4, 6, 8\\\}\\\}" + gdb_test "print vla_struct_typedef_struct_member_object" \ + "\\\{something = 10, vla_object = \\\{something = 15, vla_field = \\\{0, 3, 6, 9, 12\\\}\\\}\\\}" + gdb_test "print vla_struct_typedef_union_member_object" \ + "\\\{something = 6, vla_object = \\\{something = 6, vla_field = \\\{-1, 2, 5, 8, 11\\\}\\\}\\\}" +} # Check whatis of VLA's. gdb_test "whatis int_vla" "type = int \\\[5\\\]" @@ -65,8 +70,10 @@ gdb_test "whatis unsigned_short_vla" \ gdb_test "whatis unsigned_char_vla" "type = unsigned char \\\[5\\\]" gdb_test "whatis foo_vla" "type = struct foo \\\[5\\\]" gdb_test "whatis bar_vla" "type = BAR \\\[5\\\]" -gdb_test "whatis vla_struct_object" "type = vla_struct_typedef" -gdb_test "whatis vla_union_object" "type = union vla_union" +if {!$is_clang} { + gdb_test "whatis vla_struct_object" "type = vla_struct_typedef" + gdb_test "whatis vla_union_object" "type = union vla_union" +} # Check ptype of VLA's. gdb_test "ptype int_vla" "type = int \\\[5\\\]" @@ -82,10 +89,12 @@ gdb_test "ptype unsigned_char_vla" "type = unsigned char \\\[5\\\]" gdb_test "ptype foo_vla" "type = struct foo {\r\n\\s+int a;\r\n} \\\[5\\\]" gdb_test "ptype bar_vla" \ "type = struct bar {\r\n\\s+int x;\r\n\\s+struct foo y;\r\n} \\\[5\\\]" -gdb_test "ptype vla_struct_object" \ - "type = struct vla_struct {\r\n\\s+int something;\r\n\\s+int vla_field\\\[5\\\];\r\n}" -gdb_test "ptype vla_union_object" \ - "type = union vla_union {\r\n\\s+int vla_field\\\[5\\\];\r\n}" +if {!$is_clang} { + gdb_test "ptype vla_struct_object" \ + "type = struct vla_struct {\r\n\\s+int something;\r\n\\s+int vla_field\\\[5\\\];\r\n}" + gdb_test "ptype vla_union_object" \ + "type = union vla_union {\r\n\\s+int vla_field\\\[5\\\];\r\n}" +} # Check the size of the VLA's. gdb_breakpoint [gdb_get_line_number "break_end_of_vla_factory"] @@ -109,10 +118,12 @@ gdb_test "print uchar_size == sizeof(unsigned_char_vla)" " = 1" \ "size of unsigned_char_vla" gdb_test "print foo_size == sizeof(foo_vla)" " = 1" "size of foo_vla" gdb_test "print bar_size == sizeof(bar_vla)" " = 1" "size of bar_vla" -gdb_test "print vla_struct_object_size == sizeof(vla_struct_object)" \ - " = 1" "size of vla_struct_object" -gdb_test "print vla_union_object_size == sizeof(vla_union_object)" \ - " = 1" "size of vla_union_object" +if {!$is_clang} { + gdb_test "print vla_struct_object_size == sizeof(vla_struct_object)" \ + " = 1" "size of vla_struct_object" + gdb_test "print vla_union_object_size == sizeof(vla_union_object)" \ + " = 1" "size of vla_union_object" +} # Check side effects for sizeof argument. set sizeof_int [get_sizeof "int" 4] -- 1.8.3.1