From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id kJnNDepBn2IYNAsAWB0awg (envelope-from ) for ; Tue, 07 Jun 2022 08:17:46 -0400 Received: by simark.ca (Postfix, from userid 112) id 353E41E222; Tue, 7 Jun 2022 08:17:46 -0400 (EDT) Authentication-Results: simark.ca; dkim=pass (1024-bit key; secure) header.d=sourceware.org header.i=@sourceware.org header.a=rsa-sha256 header.s=default header.b=Iv6UL2/b; dkim-atps=neutral X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI,RDNS_DYNAMIC,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 Received: from sourceware.org (ip-8-43-85-97.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id AD2581E143 for ; Tue, 7 Jun 2022 08:17:45 -0400 (EDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 57680381FD33 for ; Tue, 7 Jun 2022 12:17:45 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 57680381FD33 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1654604265; bh=slzGClM/ILz8qSLOAAtcY+r/o/z7yAROZDLAIpzvn2o=; h=Date:To:Subject:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:Cc:From; b=Iv6UL2/bNV0Xndxm4XjcK1ehHPnoP6itab1gBKbamI1/4XdoAKDCEG/kl4yX9pEAa 3BlEQziNw3HGTXeOeta8GRYStXl9jIAIiJpJCLUpG6GYheW8ybZYPy9S665sUSAMWR xMIE3KauPUaPdK9VRaFjCiOumyDtx/OXu8j3D6W4= Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) by sourceware.org (Postfix) with ESMTPS id DF8A5381FD3A for ; Tue, 7 Jun 2022 12:17:16 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org DF8A5381FD3A Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id 1913D1F96A; Tue, 7 Jun 2022 12:17:16 +0000 (UTC) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 0094313638; Tue, 7 Jun 2022 12:17:15 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id ZuipOstBn2LdBAAAMHmgww (envelope-from ); Tue, 07 Jun 2022 12:17:15 +0000 Date: Tue, 7 Jun 2022 14:17:14 +0200 To: gdb-patches@sourceware.org Subject: [PATCH][gdb] Handle NOT_SUPPORTED_ERROR in rust-lex selftest Message-ID: <20220607121713.GA22302@delia.home> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.10.1 (2018-07-13) 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: , From: Tom de Vries via Gdb-patches Reply-To: Tom de Vries Cc: Tom Tromey Errors-To: gdb-patches-bounces+public-inbox=simark.ca@sourceware.org Sender: "Gdb-patches" Hi, When running selftest rust-lex on an openSUSE Leap 15.3 system with glibc-locale-base and glibc-locale packages deinstalled, we run into: ... $ gdb -q -batch -ex "maint selftest rust-lex" Running selftest rust-lex. Self test failed: Cannot convert between character sets `ANSI_X3.4-1968' and \ `UTF-32LE' ... Fix this by skipping the selftests that run into NOT_SUPPORTED_ERROR. This exposes that rust_parser::lex_string can leave the obstack in an intermediate state when an error is throw, which makes subsequent selftests fail. Fix this by finalizing the obstack using SCOPE_EXIT. Tested on x86_64-linux. https://sourceware.org/bugzilla/show_bug.cgi?id=29202 Any comments? Thanks, - Tom [gdb] Handle NOT_SUPPORTED_ERROR in rust-lex selftest --- gdb/rust-parse.c | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/gdb/rust-parse.c b/gdb/rust-parse.c index f5eb63ec1e3..fb128367f66 100644 --- a/gdb/rust-parse.c +++ b/gdb/rust-parse.c @@ -687,6 +687,12 @@ rust_parser::lex_string () int is_byte = pstate->lexptr[0] == 'b'; int raw_length; + SCOPE_EXIT + { + current_string_val.length = obstack_object_size (&obstack); + current_string_val.ptr = (const char *) obstack_finish (&obstack); + }; + if (is_byte) ++pstate->lexptr; raw_length = starts_raw_string (pstate->lexptr); @@ -747,8 +753,6 @@ rust_parser::lex_string () } } - current_string_val.length = obstack_object_size (&obstack); - current_string_val.ptr = (const char *) obstack_finish (&obstack); return is_byte ? BYTESTRING : STRING; } @@ -2146,14 +2150,23 @@ rust_language::parser (struct parser_state *state) const /* A test helper that lexes a string, expecting a single token. */ -static void +static bool rust_lex_test_one (rust_parser *parser, const char *input, int expected) { int token; parser->reset (input); - token = parser->lex_one_token (); + try + { + token = parser->lex_one_token (); + } + catch (const gdb_exception &exc) + { + if (exc.error == NOT_SUPPORTED_ERROR) + return false; + throw; + } SELF_CHECK (token == expected); if (token) @@ -2161,6 +2174,7 @@ rust_lex_test_one (rust_parser *parser, const char *input, int expected) token = parser->lex_one_token (); SELF_CHECK (token == 0); } + return true; } /* Test that INPUT lexes as the integer VALUE. */ @@ -2169,7 +2183,8 @@ static void rust_lex_int_test (rust_parser *parser, const char *input, ULONGEST value, int kind) { - rust_lex_test_one (parser, input, kind); + if (!rust_lex_test_one (parser, input, kind)) + return; SELF_CHECK (parser->current_int_val.val == value); } @@ -2182,7 +2197,8 @@ rust_lex_exception_test (rust_parser *parser, const char *input, try { /* The "kind" doesn't matter. */ - rust_lex_test_one (parser, input, DECIMAL_INTEGER); + if (!rust_lex_test_one (parser, input, DECIMAL_INTEGER)) + return; SELF_CHECK (0); } catch (const gdb_exception_error &except) @@ -2198,7 +2214,8 @@ static void rust_lex_stringish_test (rust_parser *parser, const char *input, const char *value, int kind) { - rust_lex_test_one (parser, input, kind); + if (!rust_lex_test_one (parser, input, kind)) + return; SELF_CHECK (parser->get_string () == value); }