From patchwork Tue Jan 23 01:31:28 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ian Lance Taylor X-Patchwork-Id: 190632 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7300:2553:b0:103:945f:af90 with SMTP id p19csp63045dyi; Mon, 22 Jan 2024 17:32:55 -0800 (PST) X-Google-Smtp-Source: AGHT+IFGWLElIdIqSd8wOEXzSUJQldNBXMIzyA5GkD+C+er0/jj8U5VD/SpQbfrlFXEQRWcAQmL6 X-Received: by 2002:a05:620a:1921:b0:783:8bfa:91f7 with SMTP id bj33-20020a05620a192100b007838bfa91f7mr6720991qkb.86.1705973575553; Mon, 22 Jan 2024 17:32:55 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1705973575; cv=pass; d=google.com; s=arc-20160816; b=CsLEdE6Nbrykd1L7KRDrmyVQsgQFAbpcdYXqVBUlk+EJf3H3ymdVdV/K8ZJHWoeiNG E4lnZoIZqGCw71yLUYe5f0f0hVlUPBrMR4Y2F0HBhMsspYwyRrLVEXpLzSynj0c+1IFn O6IqsuHQKAUKRTkJsQ7Kmu8NPB4aRP/bGsGoO8wTWY36h7sL67QDrV4waLkX4T9fzHMo UZJ+xmiYWQ7SbPya1tNjoEGsKwfdPN1ndUhyPZavUvvyE9/9OGz5mZ7kxLF8Ka40WQBY SwoSbdfpRmrekUtOHakIWnWgFniJ5XIQ3o84Wpx5uli/DSJrlYQb0kcLuFLdVrPwYg1J O3Mw== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:to:subject:message-id:date:from :mime-version:dkim-signature:arc-filter:dmarc-filter:delivered-to; bh=cCbNEcL9qGuI16a8vjZzEG+cdPRW7piUVZ9YzDsfPqw=; fh=sx1AF6BoRLLvWrm7PiL2RBt/kekZxFGoFwZKL1Ho560=; b=RFcNYIg4nD3EZf5V3ad2h115lmX9qgEOVM+ThsIRqYIZbcv1nd+ZZLT4ToiiWuyU5M BmLi93/m3HHlDdxNGlg6l8T+KubBs8M58bakmYpLhbHB73QlZOsNBqvxvbjcTLybRWhP 91JaFT4bVybga5iCgmyiz517XniwSBhL9goE4w8t9Kc/LLw5hBwB2SMzm5BcC84EBxPU AcDuEiwXAG92sWtSTmIdS/NP9G3EOGmkVlRmAbbo4suonxWE81HUCNxqnOEP9Zy4WlKA pmTBfSTDijy6/KZfui4NggCggS1jil4GBojOBkZl+/SdshWcIg9zvSsgHQRpmQ9a8kX3 73gQ== ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@golang-org.20230601.gappssmtp.com header.s=20230601 header.b=V7qjoGwh; arc=pass (i=1); spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=golang.org Received: from server2.sourceware.org (server2.sourceware.org. [2620:52:3:1:0:246e:9693:128c]) by mx.google.com with ESMTPS id b22-20020a05620a0cd600b00781bd7ade5dsi6545336qkj.578.2024.01.22.17.32.55 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 22 Jan 2024 17:32:55 -0800 (PST) Received-SPF: pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) client-ip=2620:52:3:1:0:246e:9693:128c; Authentication-Results: mx.google.com; dkim=pass header.i=@golang-org.20230601.gappssmtp.com header.s=20230601 header.b=V7qjoGwh; arc=pass (i=1); spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=golang.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id EC1C9385829D for ; Tue, 23 Jan 2024 01:32:54 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mail-yw1-x1129.google.com (mail-yw1-x1129.google.com [IPv6:2607:f8b0:4864:20::1129]) by sourceware.org (Postfix) with ESMTPS id E55AA3858407 for ; Tue, 23 Jan 2024 01:31:40 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org E55AA3858407 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=golang.org Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=golang.org ARC-Filter: OpenARC Filter v1.0.0 sourceware.org E55AA3858407 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:20::1129 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1705973503; cv=none; b=p2cS3/AvaciVsnz9vNWY7nEQgEBXY6Y1iktPO6XrBtFej1UDujORiYhrwn30F6zvVl7UeCnrs5/8w5sVXsLLDl+BQ2j7biSV7CDil51ycTcdyE/5CAENZsXDNzqkhzOHHAiEeQ9i/HaIpFR2WUthQEIgwfD7oeCGIz4sXlgn2j4= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1705973503; c=relaxed/simple; bh=VuqBYLz5NEEXQ+8yY0oB9HQ9SPcEQRpX5h3fAE2ZCvw=; h=DKIM-Signature:MIME-Version:From:Date:Message-ID:Subject:To; b=SKrg1x92kAWfayabtB6tCqU7PZQ1Cd8y6aOH9nhfeL+P/Zq5wR5MGCA0bmNdPYR/zNJQMz8zu+9nBh3Ur8r81uVjqxvIB9J0BfkNDAlr0VaIGA2ysPCxGFzqheneHNv2IbJltYuKSybtL3NYysfX4PyiFooJ39a5NeCau56FtVY= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-yw1-x1129.google.com with SMTP id 00721157ae682-600094c5703so12478257b3.3 for ; Mon, 22 Jan 2024 17:31:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=golang-org.20230601.gappssmtp.com; s=20230601; t=1705973500; x=1706578300; darn=gcc.gnu.org; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=cCbNEcL9qGuI16a8vjZzEG+cdPRW7piUVZ9YzDsfPqw=; b=V7qjoGwh+vb8U2uR4W2JS+JrJ11DCXsO/LJv6oD4L2jWw8y3rdI5OaVZeDE8Q+q+nJ JJh1F8ia8GxAp3/Tu4b3ovbqx/GotyN1ZmFl6n7J6jWVNVUkdyH75y1IJ7cAVtfXR+F8 yMbyV1jBwoZoSqCQxKkUkWMUaxengT79H/sFbDY3FbRNMqRNBPueh7fBVpCTwNWhbp3x fNYfc7S17goOnSmulR7hHkET2F6qjF6dRsPv6mxTDBWlOTDVaVZ1K1WXwJO6835UGIP2 aaIFCRddLxje4BMwMeClOm3HCKGv77e1UxW9zcjJfSuueMVGh+fHj11Xt6N0/98tk7Zh HiWw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1705973500; x=1706578300; h=to:subject:message-id:date:from:mime-version:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=cCbNEcL9qGuI16a8vjZzEG+cdPRW7piUVZ9YzDsfPqw=; b=qHSPc2sC5LPeKpBhKmfTWyMoMqrG4mgkHTuKT7MzDR+Axo0c/cJr0tvpSIW6+LQXWl RQfVpGPeqlPZzT6El04BvnwoWfhIGtjaccD/Du8iIM4tKjeml7daE8GwZGB37AeqGtj4 Z90BSWwSxYzyViOUxJizpLaEUS08YVrvcOVHEPYFyCwkfYjprsvx7YG9kNC4xbUilPgo AqwH/1Dfe+OWLnvBKVf/T0bagK7Ul1moyJJTDmFccKyr+HMBw8RggajwCfUhVWtUqRVK HmCWnPTGBBlzzCH6U3glfO0O2aBmDE31SwYJsuO3UovP475mv5dt4X5sSm2k7WGnwvHI ECQA== X-Gm-Message-State: AOJu0YxewyTQMtSVk9aEVi/QEG5l7zD+qjoAS0eu0JUmGqFkmmD8Lp1Y 7dwcowpTUPzgC2O0T7nIi6Z0T1w6yIQfBt8w4zZO1rL6IGrzF0Jj3qxHZnb3UZtYfigPRm8AusN xGBky4aTJRrAY5q2llQEtt/jhZvVDfhevZtSGgyVvQRMoPojRCKg= X-Received: by 2002:a0d:d0c2:0:b0:5d7:1940:7d66 with SMTP id s185-20020a0dd0c2000000b005d719407d66mr4384150ywd.61.1705973500001; Mon, 22 Jan 2024 17:31:40 -0800 (PST) MIME-Version: 1.0 From: Ian Lance Taylor Date: Mon, 22 Jan 2024 17:31:28 -0800 Message-ID: Subject: Go patch committed: Don't pass iota value to lowering pass To: gcc-patches , gofrontend-dev X-Spam-Status: No, score=-9.1 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1788842948032414833 X-GMAIL-MSGID: 1788842948032414833 This patch to the Go frontend stops passing the iota value to the lowering pass. It is no longer used. The iota value is now handled in the determine-types pass. Bootstrapped and ran Go testsuite on x86_64-pc-linux-gnu. Committed to mainline. Ian 896148947b9ff4845c8bc334f8eff30f91ff3c9a diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE index b41ac99f7a8..c2a6032ae80 100644 --- a/gcc/go/gofrontend/MERGE +++ b/gcc/go/gofrontend/MERGE @@ -1,4 +1,4 @@ -61b29a99dadf33c48a0a063f50f61e877fb419b8 +ddf3758e4a45ca2816fb68f3e4224501a3c4c438 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/expressions.cc b/gcc/go/gofrontend/expressions.cc index a09d33b868e..51ff0206129 100644 --- a/gcc/go/gofrontend/expressions.cc +++ b/gcc/go/gofrontend/expressions.cc @@ -1007,7 +1007,7 @@ Expression::make_type(Type* type, Location location) Expression* Var_expression::do_lower(Gogo* gogo, Named_object* function, - Statement_inserter* inserter, int) + Statement_inserter* inserter) { if (this->variable_->is_variable()) { @@ -1158,7 +1158,7 @@ Enclosed_var_expression::do_traverse(Traverse*) Expression* Enclosed_var_expression::do_lower(Gogo* gogo, Named_object* function, - Statement_inserter* inserter, int) + Statement_inserter* inserter) { gogo->lower_expression(function, inserter, &this->reference_); return this; @@ -2097,7 +2097,7 @@ Unknown_expression::do_is_addressable() const // Lower a reference to an unknown name. Expression* -Unknown_expression::do_lower(Gogo*, Named_object*, Statement_inserter*, int) +Unknown_expression::do_lower(Gogo*, Named_object*, Statement_inserter*) { if (this->is_error_expression()) return Expression::make_error(this->location()); @@ -3642,7 +3642,7 @@ Const_expression::do_is_zero_value() const // predeclared constant iota into an integer value. Expression* -Const_expression::do_lower(Gogo* gogo, Named_object*, Statement_inserter*, int) +Const_expression::do_lower(Gogo* gogo, Named_object*, Statement_inserter*) { Location loc = this->location(); @@ -4120,7 +4120,7 @@ class Iota_expression : public Parser_expression { } Expression* - do_lower(Gogo*, Named_object*, Statement_inserter*, int) + do_lower(Gogo*, Named_object*, Statement_inserter*) { go_unreachable(); } // There should only ever be one of these. @@ -4171,7 +4171,7 @@ Type_conversion_expression::do_type() Expression* Type_conversion_expression::do_lower(Gogo* gogo, Named_object*, - Statement_inserter* inserter, int) + Statement_inserter* inserter) { Type* type = this->type_; Expression* val = this->expr_; @@ -4997,7 +4997,7 @@ Unary_expression::check_operand_address_taken(Gogo*) // instead. Expression* -Unary_expression::do_lower(Gogo* gogo, Named_object*, Statement_inserter*, int) +Unary_expression::do_lower(Gogo* gogo, Named_object*, Statement_inserter*) { Location loc = this->location(); @@ -6677,7 +6677,7 @@ Binary_expression::eval_complex(Operator op, const Numeric_constant* left_nc, Expression* Binary_expression::do_lower(Gogo* gogo, Named_object*, - Statement_inserter* inserter, int) + Statement_inserter* inserter) { Location location = this->location(); @@ -8955,7 +8955,7 @@ class Selector_expression : public Parser_expression do_issue_nil_check(); Expression* - do_lower(Gogo*, Named_object*, Statement_inserter*, int); + do_lower(Gogo*, Named_object*, Statement_inserter*); Expression* do_copy() @@ -9030,7 +9030,7 @@ Selector_expression::do_issue_nil_check() // Lower a selector expression to the resolved value. Expression* -Selector_expression::do_lower(Gogo*, Named_object*, Statement_inserter*, int) +Selector_expression::do_lower(Gogo*, Named_object*, Statement_inserter*) { if (this->is_error_expression() || this->resolved_ == NULL) return Expression::make_error(this->location()); @@ -9360,7 +9360,7 @@ Builtin_call_expression::do_set_recover_arg(Expression* arg) Expression* Builtin_call_expression::do_lower(Gogo* gogo, Named_object* function, - Statement_inserter* inserter, int) + Statement_inserter* inserter) { if (this->is_error_expression()) return this; @@ -12564,7 +12564,7 @@ Call_expression::do_discarding_value() Expression* Call_expression::do_lower(Gogo* gogo, Named_object*, - Statement_inserter* inserter, int) + Statement_inserter* inserter) { if (this->lowered_ != NULL) return this->lowered_; @@ -14836,7 +14836,7 @@ Index_expression::do_issue_nil_check() // expression into an array index, a string index, or a map index. Expression* -Index_expression::do_lower(Gogo*, Named_object*, Statement_inserter*, int) +Index_expression::do_lower(Gogo*, Named_object*, Statement_inserter*) { if (this->is_error_expression()) return Expression::make_error(this->location()); @@ -16211,7 +16211,7 @@ Expression::make_map_index(Expression* map, Expression* index, Expression* Field_reference_expression::do_lower(Gogo* gogo, Named_object* function, - Statement_inserter* inserter, int) + Statement_inserter* inserter) { Struct_type* struct_type = this->expr_->type()->struct_type(); if (struct_type == NULL) @@ -18018,7 +18018,7 @@ class Composite_literal_key_expression : public Parser_expression do_determine_type(Gogo*, const Type_context*); Expression* - do_lower(Gogo*, Named_object*, Statement_inserter*, int); + do_lower(Gogo*, Named_object*, Statement_inserter*); Expression* do_copy() @@ -18084,7 +18084,7 @@ Composite_literal_key_expression::do_type() Expression* Composite_literal_key_expression::do_lower(Gogo*, Named_object*, - Statement_inserter*, int) + Statement_inserter*) { if (this->is_error_expression()) return Expression::make_error(this->location()); @@ -18658,7 +18658,7 @@ Composite_literal_expression::do_check_types(Gogo* gogo) Expression* Composite_literal_expression::do_lower(Gogo* gogo, Named_object* function, - Statement_inserter* inserter, int) + Statement_inserter* inserter) { if (this->is_error_expression() || this->type_->is_error()) return Expression::make_error(this->location()); diff --git a/gcc/go/gofrontend/expressions.h b/gcc/go/gofrontend/expressions.h index 87637721372..0eddb58bc50 100644 --- a/gcc/go/gofrontend/expressions.h +++ b/gcc/go/gofrontend/expressions.h @@ -990,9 +990,8 @@ class Expression // which could not be fully parsed into their final form. It // returns the same Expression or a new one. Expression* - lower(Gogo* gogo, Named_object* function, Statement_inserter* inserter, - int iota_value) - { return this->do_lower(gogo, function, inserter, iota_value); } + lower(Gogo* gogo, Named_object* function, Statement_inserter* inserter) + { return this->do_lower(gogo, function, inserter); } // Flatten an expression. This is called after order_evaluation. // FUNCTION is the function we are in; it will be NULL for an @@ -1162,7 +1161,7 @@ class Expression // Return a lowered expression. virtual Expression* - do_lower(Gogo*, Named_object*, Statement_inserter*, int) + do_lower(Gogo*, Named_object*, Statement_inserter*) { return this; } // Return a flattened expression. @@ -1472,7 +1471,7 @@ class Parser_expression : public Expression protected: virtual Expression* - do_lower(Gogo*, Named_object*, Statement_inserter*, int) = 0; + do_lower(Gogo*, Named_object*, Statement_inserter*) = 0; Bexpression* do_get_backend(Translate_context*) @@ -1511,7 +1510,7 @@ class Const_expression : public Expression do_traverse(Traverse*); Expression* - do_lower(Gogo*, Named_object*, Statement_inserter*, int); + do_lower(Gogo*, Named_object*, Statement_inserter*); bool do_is_constant() const @@ -1599,7 +1598,7 @@ class Var_expression : public Expression protected: Expression* - do_lower(Gogo*, Named_object*, Statement_inserter*, int); + do_lower(Gogo*, Named_object*, Statement_inserter*); Type* do_type(); @@ -1663,7 +1662,7 @@ class Enclosed_var_expression : public Expression do_traverse(Traverse*); Expression* - do_lower(Gogo*, Named_object*, Statement_inserter*, int); + do_lower(Gogo*, Named_object*, Statement_inserter*); Expression* do_flatten(Gogo*, Named_object*, Statement_inserter*); @@ -1953,7 +1952,7 @@ class Type_conversion_expression : public Expression do_traverse(Traverse* traverse); Expression* - do_lower(Gogo*, Named_object*, Statement_inserter*, int); + do_lower(Gogo*, Named_object*, Statement_inserter*); Expression* do_flatten(Gogo*, Named_object*, Statement_inserter*); @@ -2154,7 +2153,7 @@ class Unary_expression : public Expression { return Expression::traverse(&this->expr_, traverse); } Expression* - do_lower(Gogo*, Named_object*, Statement_inserter*, int); + do_lower(Gogo*, Named_object*, Statement_inserter*); Expression* do_flatten(Gogo*, Named_object*, Statement_inserter*); @@ -2315,7 +2314,7 @@ class Binary_expression : public Expression do_traverse(Traverse* traverse); Expression* - do_lower(Gogo*, Named_object*, Statement_inserter*, int); + do_lower(Gogo*, Named_object*, Statement_inserter*); Expression* do_flatten(Gogo*, Named_object*, Statement_inserter*); @@ -2440,7 +2439,7 @@ class String_concat_expression : public Expression { return this->exprs_->traverse(traverse); } Expression* - do_lower(Gogo*, Named_object*, Statement_inserter*, int) + do_lower(Gogo*, Named_object*, Statement_inserter*) { return this; } Expression* @@ -2628,7 +2627,7 @@ class Call_expression : public Expression do_traverse(Traverse*); virtual Expression* - do_lower(Gogo*, Named_object*, Statement_inserter*, int); + do_lower(Gogo*, Named_object*, Statement_inserter*); virtual Expression* do_flatten(Gogo*, Named_object*, Statement_inserter*); @@ -2823,7 +2822,7 @@ class Builtin_call_expression : public Call_expression protected: // This overrides Call_expression::do_lower. Expression* - do_lower(Gogo*, Named_object*, Statement_inserter*, int); + do_lower(Gogo*, Named_object*, Statement_inserter*); Expression* do_flatten(Gogo*, Named_object*, Statement_inserter*); @@ -3169,7 +3168,7 @@ class Unknown_expression : public Parser_expression do_is_addressable() const; Expression* - do_lower(Gogo*, Named_object*, Statement_inserter*, int); + do_lower(Gogo*, Named_object*, Statement_inserter*); Expression* do_copy() @@ -3238,7 +3237,7 @@ class Index_expression : public Parser_expression do_is_addressable() const; Expression* - do_lower(Gogo*, Named_object*, Statement_inserter*, int); + do_lower(Gogo*, Named_object*, Statement_inserter*s); Expression* do_copy() @@ -3739,7 +3738,7 @@ class Field_reference_expression : public Expression { return Expression::traverse(&this->expr_, traverse); } Expression* - do_lower(Gogo*, Named_object*, Statement_inserter*, int); + do_lower(Gogo*, Named_object*, Statement_inserter*); Type* do_type(); @@ -3965,7 +3964,7 @@ class Composite_literal_expression : public Parser_expression do_check_types(Gogo*); Expression* - do_lower(Gogo*, Named_object*, Statement_inserter*, int); + do_lower(Gogo*, Named_object*, Statement_inserter*); Expression* do_copy(); diff --git a/gcc/go/gofrontend/gogo.cc b/gcc/go/gofrontend/gogo.cc index 7a6b9e31df0..71988dce3a8 100644 --- a/gcc/go/gofrontend/gogo.cc +++ b/gcc/go/gofrontend/gogo.cc @@ -2914,7 +2914,7 @@ class Lower_parse_tree : public Traverse | traverse_functions | traverse_statements | traverse_expressions), - gogo_(gogo), function_(function), iota_value_(-1), inserter_() + gogo_(gogo), function_(function), inserter_() { } void @@ -2941,8 +2941,6 @@ class Lower_parse_tree : public Traverse Gogo* gogo_; // The function we are traversing. Named_object* function_; - // Value to use for the predeclared constant iota. - int iota_value_; // Current statement inserter for use by expressions. Statement_inserter inserter_; }; @@ -3086,7 +3084,7 @@ Lower_parse_tree::expression(Expression** pexpr) { Expression* e = *pexpr; Expression* enew = e->lower(this->gogo_, this->function_, - &this->inserter_, this->iota_value_); + &this->inserter_); if (enew == e) break; if (enew->traverse_subexpressions(this) == TRAVERSE_EXIT)