From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTPS id 74C2E3858D38 for ; Mon, 3 Oct 2022 15:02:11 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 74C2E3858D38 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1664809330; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=fkB4nMbS+v0wjw70WmesBbGYvZ6H1JKx4JDFEvg92fA=; b=W44u3iHBZZvMZcSOWgvQ1n1FqCTUk9mnB18F3qan7SpzvZS8AyAkV2Ydwp3G2aaqBQFQCj qezIHzbZJI4mLihbozEm81fADjKuCK+kXMgUkWe9Z502PUo7U8WebZvhqvKProvi26JRM1 BfJ35+92NyyeiyHWr53Fi694BBrum1g= Received: from mail-qk1-f199.google.com (mail-qk1-f199.google.com [209.85.222.199]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-153-1r8aagyWPVGDeqRgQ4zkMQ-1; Mon, 03 Oct 2022 11:02:08 -0400 X-MC-Unique: 1r8aagyWPVGDeqRgQ4zkMQ-1 Received: by mail-qk1-f199.google.com with SMTP id w10-20020a05620a444a00b006ce9917ea1fso9300193qkp.16 for ; Mon, 03 Oct 2022 08:02:08 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:in-reply-to:from:references:cc:to :content-language:subject:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date; bh=fkB4nMbS+v0wjw70WmesBbGYvZ6H1JKx4JDFEvg92fA=; b=1ptJE9eN6Odg0rSd6a+zr6gE4f/tbrqnHGxSI9ImirThEWgu6CVFKDaTjdHa4kW2z2 JpH9klbXqc68DCJ7m1gLCdf2oKr5Li5eVjrN8aoViK7QMrOFEMC563OKgM5bwVxFmlCg reKWkADo4JcW6MGI2ttpxAXnRGc1YjEDNgvAMVlmFN+JLnKgtuEdGDhJDZUxFDPADqzv j1hzbUBaNiwMHq7vUn5w3xwuC2Dyrbg518sVTlpuHAGu7uoOniekkRHZJbN1QKOP2Om1 tP8VOtlSqGIl7ro+GoiLupQjCDifJW+SMWRtgMzuILimKg87fTkKXtFVwHQpgG3GcfU3 44cA== X-Gm-Message-State: ACrzQf1MBN/Nq2aV4zsZSz5E9swuWySEz0eOtnCJ4Mv7KVsAOK/fap8W hFmLL4wV2x6UpIr0mw9hkMRp0dSDSltE5+80fFhy57VMxIaiXGR8fchwn9c4YuUAiyLgP4LdFB1 jP2eQKE2IgoHGlEV8nQ== X-Received: by 2002:ac8:5e14:0:b0:35c:bab9:173e with SMTP id h20-20020ac85e14000000b0035cbab9173emr16342370qtx.222.1664809327712; Mon, 03 Oct 2022 08:02:07 -0700 (PDT) X-Google-Smtp-Source: AMsMyM5qoK7C+nrQfXJMmZHJw7FgQESG2ZQKPNG+MQy3FOD0WOzyQg5P6nml6XJ/ALAtWuFIB/8XFA== X-Received: by 2002:ac8:5e14:0:b0:35c:bab9:173e with SMTP id h20-20020ac85e14000000b0035cbab9173emr16342323qtx.222.1664809327295; Mon, 03 Oct 2022 08:02:07 -0700 (PDT) Received: from [192.168.1.101] (130-44-159-43.s15913.c3-0.arl-cbr1.sbo-arl.ma.cable.rcncustomer.com. [130.44.159.43]) by smtp.gmail.com with ESMTPSA id w41-20020a05622a192900b0035d432f5ba3sm9354527qtc.17.2022.10.03.08.02.06 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 03 Oct 2022 08:02:06 -0700 (PDT) Message-ID: <7c31e64f-5bf5-0369-f18d-5257fe277bcf@redhat.com> Date: Mon, 3 Oct 2022 11:02:05 -0400 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.13.1 Subject: Re: [PATCH] c++: Disallow jumps into statement expressions To: Jakub Jelinek Cc: gcc-patches@gcc.gnu.org References: <8b360a15-5255-3fbe-16f4-84eaf0fa9612@redhat.com> From: Jason Merrill In-Reply-To: X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Language: en-US Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-5.8 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FUZZY_PRICES,NICE_REPLY_A,RCVD_IN_DNSWL_LOW,SPF_HELO_NONE,SPF_NONE,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: On 10/2/22 07:35, Jakub Jelinek wrote: > On Fri, Sep 30, 2022 at 04:39:25PM -0400, Jason Merrill wrote: >>> --- gcc/cp/decl.cc.jj 2022-09-22 00:14:55.478599363 +0200 >>> +++ gcc/cp/decl.cc 2022-09-22 00:24:01.121178256 +0200 >>> @@ -223,6 +223,7 @@ struct GTY((for_user)) named_label_entry >>> bool in_transaction_scope; >>> bool in_constexpr_if; >>> bool in_consteval_if; >>> + bool in_assume; >> >> I think it would be better to reject jumps into statement-expressions like >> the C front-end. > > Ok, here is a self-contained patch that does that. > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? OK, thanks. > 2022-10-01 Jakub Jelinek > > * cp-tree.h (BCS_STMT_EXPR): New enumerator. > * name-lookup.h (enum scope_kind): Add sk_stmt_expr. > * name-lookup.cc (begin_scope): Handle sk_stmt_expr like sk_block. > * semantics.cc (begin_compound_stmt): For BCS_STMT_EXPR use > sk_stmt_expr. > * parser.cc (cp_parser_statement_expr): Use BCS_STMT_EXPR instead of > BCS_NORMAL. > * decl.cc (struct named_label_entry): Add in_stmt_expr. > (poplevel_named_label_1): Handle sk_stmt_expr. > (check_previous_goto_1): Diagnose entering of statement expression. > (check_goto): Likewise. > > * g++.dg/ext/stmtexpr24.C: New test. > > --- gcc/cp/cp-tree.h.jj 2022-09-30 18:38:55.351607176 +0200 > +++ gcc/cp/cp-tree.h 2022-10-01 13:06:20.731720730 +0200 > @@ -7599,7 +7599,8 @@ enum { > BCS_NO_SCOPE = 1, > BCS_TRY_BLOCK = 2, > BCS_FN_BODY = 4, > - BCS_TRANSACTION = 8 > + BCS_TRANSACTION = 8, > + BCS_STMT_EXPR = 16 > }; > extern tree begin_compound_stmt (unsigned int); > > --- gcc/cp/name-lookup.h.jj 2022-09-23 09:02:31.103668514 +0200 > +++ gcc/cp/name-lookup.h 2022-10-01 13:37:50.158404107 +0200 > @@ -200,6 +200,7 @@ enum scope_kind { > init-statement. */ > sk_cond, /* The scope of the variable declared in the condition > of an if or switch statement. */ > + sk_stmt_expr, /* GNU statement expression block. */ > sk_function_parms, /* The scope containing function parameters. */ > sk_class, /* The scope containing the members of a class. */ > sk_scoped_enum, /* The scope containing the enumerators of a C++11 > --- gcc/cp/name-lookup.cc.jj 2022-09-13 09:21:28.123540623 +0200 > +++ gcc/cp/name-lookup.cc 2022-10-01 13:37:26.383732959 +0200 > @@ -4296,6 +4296,7 @@ begin_scope (scope_kind kind, tree entit > case sk_scoped_enum: > case sk_transaction: > case sk_omp: > + case sk_stmt_expr: > scope->keep = keep_next_level_flag; > break; > > --- gcc/cp/semantics.cc.jj 2022-09-30 18:38:50.337675080 +0200 > +++ gcc/cp/semantics.cc 2022-10-01 13:09:34.958970367 +0200 > @@ -1761,6 +1761,8 @@ begin_compound_stmt (unsigned int flags) > sk = sk_try; > else if (flags & BCS_TRANSACTION) > sk = sk_transaction; > + else if (flags & BCS_STMT_EXPR) > + sk = sk_stmt_expr; > r = do_pushlevel (sk); > } > > --- gcc/cp/parser.cc.jj 2022-09-30 18:38:55.374606864 +0200 > +++ gcc/cp/parser.cc 2022-10-01 13:08:27.367927479 +0200 > @@ -5272,7 +5272,7 @@ cp_parser_statement_expr (cp_parser *par > /* Start the statement-expression. */ > tree expr = begin_stmt_expr (); > /* Parse the compound-statement. */ > - cp_parser_compound_statement (parser, expr, BCS_NORMAL, false); > + cp_parser_compound_statement (parser, expr, BCS_STMT_EXPR, false); > /* Finish up. */ > expr = finish_stmt_expr (expr, false); > /* Consume the ')'. */ > --- gcc/cp/decl.cc.jj 2022-09-27 08:27:47.671428567 +0200 > +++ gcc/cp/decl.cc 2022-10-01 13:14:57.990434730 +0200 > @@ -223,6 +223,7 @@ struct GTY((for_user)) named_label_entry > bool in_transaction_scope; > bool in_constexpr_if; > bool in_consteval_if; > + bool in_stmt_expr; > }; > > #define named_labels cp_function_chain->x_named_labels > @@ -538,6 +539,9 @@ poplevel_named_label_1 (named_label_entr > case sk_transaction: > ent->in_transaction_scope = true; > break; > + case sk_stmt_expr: > + ent->in_stmt_expr = true; > + break; > case sk_block: > if (level_for_constexpr_if (bl->level_chain)) > ent->in_constexpr_if = true; > @@ -3487,7 +3491,7 @@ check_previous_goto_1 (tree decl, cp_bin > bool complained = false; > int identified = 0; > bool saw_eh = false, saw_omp = false, saw_tm = false, saw_cxif = false; > - bool saw_ceif = false; > + bool saw_ceif = false, saw_se = false; > > if (exited_omp) > { > @@ -3560,6 +3564,12 @@ check_previous_goto_1 (tree decl, cp_bin > saw_tm = true; > break; > > + case sk_stmt_expr: > + if (!saw_se) > + inf = G_(" enters statement expression"); > + saw_se = true; > + break; > + > case sk_block: > if (!saw_cxif && level_for_constexpr_if (b->level_chain)) > { > @@ -3650,12 +3660,13 @@ check_goto (tree decl) > > if (ent->in_try_scope || ent->in_catch_scope || ent->in_transaction_scope > || ent->in_constexpr_if || ent->in_consteval_if > - || ent->in_omp_scope || !vec_safe_is_empty (ent->bad_decls)) > + || ent->in_omp_scope || ent->in_stmt_expr > + || !vec_safe_is_empty (ent->bad_decls)) > { > diagnostic_t diag_kind = DK_PERMERROR; > if (ent->in_try_scope || ent->in_catch_scope || ent->in_constexpr_if > || ent->in_consteval_if || ent->in_transaction_scope > - || ent->in_omp_scope) > + || ent->in_omp_scope || ent->in_stmt_expr) > diag_kind = DK_ERROR; > complained = identify_goto (decl, DECL_SOURCE_LOCATION (decl), > &input_location, diag_kind); > @@ -3703,6 +3714,8 @@ check_goto (tree decl) > inform (input_location, " enters % statement"); > else if (ent->in_consteval_if) > inform (input_location, " enters % statement"); > + else if (ent->in_stmt_expr) > + inform (input_location, " enters statement expression"); > } > > if (ent->in_omp_scope) > --- gcc/testsuite/g++.dg/ext/stmtexpr24.C.jj 2022-10-01 13:34:01.471565458 +0200 > +++ gcc/testsuite/g++.dg/ext/stmtexpr24.C 2022-10-01 13:39:56.078662362 +0200 > @@ -0,0 +1,27 @@ > +// { dg-do compile } > +// { dg-options "" } > + > +void > +foo (int x) > +{ > + bool a = false; > + if (x == 1) > + goto l1; // { dg-message "from here" } > + a = ({ l0:; if (x == 0) goto l0; true; }); > + a = ({ if (x == 0) throw 1; true; }); > + a = ({ l1:; true; }); // { dg-error "jump to label 'l1'" } > + // { dg-message "enters statement expression" "" { target *-*-* } .-1 } > + a = ({ l2:; true; }); // { dg-error "jump to label 'l2'" } > + switch (x) > + { > + case 2: > + a = ({ case 3:; true; }); // { dg-error "jump to case label" } > + // { dg-message "enters statement expression" "" { target *-*-* } .-1 } > + a = ({ default:; true; }); // { dg-error "jump to case label" } > + // { dg-message "enters statement expression" "" { target *-*-* } .-1 } > + break; > + } > + if (x == 4) > + goto l2; // { dg-message "from here" } > + // { dg-message "enters statement expression" "" { target *-*-* } .-1 } > +} > > > Jakub >