From patchwork Mon Nov 30 20:11:09 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ian Lance Taylor X-Patchwork-Id: 1408467 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=2620:52:3:1:0:246e:9693:128c; helo=sourceware.org; envelope-from=gcc-patches-bounces@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gcc.gnu.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.a=rsa-sha256 header.s=default header.b=ansq4a+K; dkim-atps=neutral Received: from sourceware.org (server2.sourceware.org [IPv6:2620:52:3:1:0:246e:9693:128c]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4ClGb568DRz9sVj for ; Tue, 1 Dec 2020 07:11:29 +1100 (AEDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id F2E92384A02D; Mon, 30 Nov 2020 20:11:26 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org F2E92384A02D DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1606767087; bh=S8fNzVZqiA7mZCO+KiARyZ2BXQ0LWnVbnpz0z8TVPKA=; h=Date:Subject:To:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=ansq4a+KGU/udNmJcN5+TCBbyYSOLkbhrSVrBkesWKKKI5xxRGIe1AKH1cwh40IuE 8zlyAwyOIEEPdGKQzHey5Wk6unjehHgMHWrOlwlV1E8G8soNfuX1NsYQpt2mB5f/hV szmDg5hOQbmFmLwnysCLvh5uq6VvTfO/QgD6r8Yc= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mail-ej1-x62f.google.com (mail-ej1-x62f.google.com [IPv6:2a00:1450:4864:20::62f]) by sourceware.org (Postfix) with ESMTPS id D496C384A02D for ; Mon, 30 Nov 2020 20:11:23 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org D496C384A02D Received: by mail-ej1-x62f.google.com with SMTP id f9so22108061ejw.4 for ; Mon, 30 Nov 2020 12:11:23 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=S8fNzVZqiA7mZCO+KiARyZ2BXQ0LWnVbnpz0z8TVPKA=; b=UV1jqnactaILDoVXgGbR0VevDLjX7Tzv5wisDxWAmuwXYGc/1BZNgbTwZzE3GwS+Wj a+NKqbkLzGH2Fb3M7qSiLv76JDRKvP+epR/ssF3XL29oMtEBs3EBoJgS4IKuRPXOfaWD NDDlXIJr4vXIjK/Cs2nudiIZzQYWnDk2kpjHg1YYAzNOy/RSfzwJfLYIbG4uZUVXVl2g iUWmrftK74SQtlUJyDJqxRgwhnEPt/Oeyktfs3/29DB6ljan6Dvlqy3mAQOxOLNpgyWv XVAuD1n0At5nffA2whE3YO1Xz+gZhtudfICy7JDfQLPJ5j9NYkkL0QisVRArr0pdSfjO DdWg== X-Gm-Message-State: AOAM5325VY/W06IvfZHvq+NJdZeauBVDVTMTNuahPt4C1NxMw+cPFsEO V7J8zGuXJUvSCxAGmh3ZaE6KxaXHBZxYO5tXbqKs0VBCgJI8gA== X-Google-Smtp-Source: ABdhPJy9gWegLW2sOUygjGjCtoKG3tCszKNyuajf1TCBup9/WPe1Jlr6Dy7vzV1u1MYjlEqzCY3TkBrMpij5Jyl9bp4= X-Received: by 2002:a17:906:4049:: with SMTP id y9mr11967984ejj.442.1606767081758; Mon, 30 Nov 2020 12:11:21 -0800 (PST) MIME-Version: 1.0 Date: Mon, 30 Nov 2020 12:11:09 -0800 Message-ID: Subject: Go patch committed: Use correct assignment order for type assertions To: gcc-patches , gofrontend-dev X-Spam-Status: No, score=-11.8 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, 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: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Ian Lance Taylor via Gcc-patches From: Ian Lance Taylor Reply-To: Ian Lance Taylor Errors-To: gcc-patches-bounces@gcc.gnu.org Sender: "Gcc-patches" This patch to the Go frontend uses the use correct assignment order for type assertions. For "a, b := v.(T)" we must set a before b. This is for https://golang.org/issue/13433. Bootstrapped and ran Go testsuite on x86_64-pc-linux-gnu. Committed to mainline. Ian c7f272e05e1cf8c7d7caefe5ee542845cf4cc7c8 diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE index 698969fc8c8..e2fc0b5560b 100644 --- a/gcc/go/gofrontend/MERGE +++ b/gcc/go/gofrontend/MERGE @@ -1,4 +1,4 @@ -af683486b4de5503b2b6d9ae974a2ab1eeb92290 +213abeedc85ed638a878f9457e422897fda3a111 The first line of this file holds the git revision number of the last merge done from the gofrontend repository. diff --git a/gcc/go/gofrontend/statements.cc b/gcc/go/gofrontend/statements.cc index ad898070f6e..25e25364cee 100644 --- a/gcc/go/gofrontend/statements.cc +++ b/gcc/go/gofrontend/statements.cc @@ -1985,18 +1985,42 @@ Tuple_type_guard_assignment_statement::lower_to_object_type( NULL, loc); b->add_statement(val_temp); - // ok = CODE(type_descriptor, expr, &val_temp) + // var ok_temp bool + Temporary_statement* ok_temp = NULL; + if (!this->ok_->is_sink_expression()) + { + ok_temp = Statement::make_temporary(this->ok_->type(), + NULL, loc); + b->add_statement(ok_temp); + } + + // ok_temp = CODE(type_descriptor, expr, &val_temp) Expression* p1 = Expression::make_type_descriptor(this->type_, loc); Expression* ref = Expression::make_temporary_reference(val_temp, loc); Expression* p3 = Expression::make_unary(OPERATOR_AND, ref, loc); Expression* call = Runtime::make_call(code, loc, 3, p1, this->expr_, p3); - Statement* s = Statement::make_assignment(this->ok_, call, loc); + Statement* s; + if (ok_temp == NULL) + s = Statement::make_statement(call, true); + else + { + Expression* ok_ref = Expression::make_temporary_reference(ok_temp, loc); + s = Statement::make_assignment(ok_ref, call, loc); + } b->add_statement(s); // val = val_temp ref = Expression::make_temporary_reference(val_temp, loc); s = Statement::make_assignment(this->val_, ref, loc); b->add_statement(s); + + // ok = ok_temp + if (ok_temp != NULL) + { + ref = Expression::make_temporary_reference(ok_temp, loc); + s = Statement::make_assignment(this->ok_, ref, loc); + b->add_statement(s); + } } // Dump the AST representation for a tuple type guard statement.