From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pl1-x632.google.com (mail-pl1-x632.google.com [IPv6:2607:f8b0:4864:20::632]) by sourceware.org (Postfix) with ESMTPS id EB2A83858C33 for ; Thu, 20 Jul 2023 09:36:31 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org EB2A83858C33 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-pl1-x632.google.com with SMTP id d9443c01a7336-1b8b2886364so3288385ad.0 for ; Thu, 20 Jul 2023 02:36:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1689845790; x=1690450590; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:from:to:cc:subject:date:message-id:reply-to; bh=Bq6aJPj+9YfVBBJ2AtCoXDKw5Ytq3HlCa8roVmHgO5w=; b=Lk2id5obZs0CSYnaY9bouR2UP0MaH6Op0GaUp1ESz2hVV6qeemNmSk3vHqLbEb5z50 05wEvY6jmmOxtNpOp2/Vdqo2cSrgg7rnR9dW5EecxA6nmvOM23r0m1v6gHf4SdP9tZUx jWkrJ/2vFk+zdxZGhow2z5bWRGPy36EMZ7BrlyudAkGn6TwWMcsf1YycYMf5C0Wvunq6 3g2H6UytS4JWD9BmOdO1kFLGroB6YrahCiBi1TrskxVh/8wOmYxg2vSwDlO3vhY1GDE7 /Q+ySUo8mF4ryUDdq7ibdcum0rczQ3NBc5fC5DqK3ozraFqTo0f/LMY92zwlnLN/eH5b d5zw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689845790; x=1690450590; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=Bq6aJPj+9YfVBBJ2AtCoXDKw5Ytq3HlCa8roVmHgO5w=; b=e4xzd+vQjipY2EoCii3O4wiINZx43s+7ivsk5gY/L0ptMu9x9KBVycRFKYmLOpujyZ vl11iC7dnQAOpkNgaNEd3RbWkO1HoHg2fMh93gDWcoW/U9SgtSmfUuU7vPZ0Zr5j6rm0 YrU44xrJF5aqPB+VwMNnqa8cCsjOtDdmkPhFNnTlquZJA3ALAnOHzMRVlrMz2wZMBMZV 0btoXs5TgETe/1Xe5Ef9aAJFkKRLsvFUe3Ay56zmQ5HsuIkGkHCwZtUlLsjfonlKRVlS y2IYD2FXCckmAjyKzxxCAyZUSnLeWM/ssUYekYDhEvrNxhyZyjSLj/WUR7wDE57ub3LB Crjw== X-Gm-Message-State: ABy/qLa6gWb/KqLpQq3oyJMEfd7hnk83FPE3iLS6zJEMkcMmgmbI5y16 axEJHJ1RTr/40qzxiq8cqbwX/FhsCBk= X-Google-Smtp-Source: APBJJlFqXqZ/vcEHrg6BWgM6u1YaOGArL5AZEBKOwQP+SLYt6qQzyk626oUf/Zh2N0iM1Sa6/Iddzg== X-Received: by 2002:a17:902:8548:b0:1b8:7e55:7a8c with SMTP id d8-20020a170902854800b001b87e557a8cmr4374716plo.56.1689845789918; Thu, 20 Jul 2023 02:36:29 -0700 (PDT) Received: from Thaum.localdomain (59-102-120-25.tpgi.com.au. [59.102.120.25]) by smtp.gmail.com with ESMTPSA id w13-20020a170902d70d00b001afd821c057sm845765ply.58.2023.07.20.02.36.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 20 Jul 2023 02:36:29 -0700 (PDT) Date: Thu, 20 Jul 2023 19:36:24 +1000 From: Nathaniel Shead To: gcc-patches@gcc.gnu.org Cc: Jason Merrill , Patrick Palka Subject: [PATCH v4 2/3] c++: Improve constexpr error for dangling local variables [PR110619] Message-ID: References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: X-Spam-Status: No, score=-11.6 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,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 List-Id: Currently, when typeck discovers that a return statement will refer to a local variable it rewrites to return a null pointer. This causes the error messages for using the return value in a constant expression to be unhelpful, especially for reference return values. This patch removes this "optimisation". Relying on this raises a warning by default and causes UB anyway, so there should be no issue in doing so. We also suppress additional warnings from later passes that detect this as a dangling pointer, since we've already indicated this anyway. PR c++/110619 gcc/cp/ChangeLog: * semantics.cc (finish_return_stmt): Suppress dangling pointer reporting on return statement if already reported. * typeck.cc (check_return_expr): Don't set return expression to zero for dangling addresses. gcc/testsuite/ChangeLog: * g++.dg/cpp1y/constexpr-lifetime5.C: Test reported message is correct. * g++.dg/cpp1y/constexpr-lifetime6.C: Likewise. * g++.dg/cpp1y/constexpr-110619.C: New test. * g++.dg/warn/Wreturn-local-addr-6.C: Remove check for return value optimisation. Signed-off-by: Nathaniel Shead --- gcc/cp/semantics.cc | 5 ++++- gcc/cp/typeck.cc | 5 +++-- gcc/testsuite/g++.dg/cpp1y/constexpr-110619.C | 10 ++++++++++ gcc/testsuite/g++.dg/cpp1y/constexpr-lifetime5.C | 4 ++-- gcc/testsuite/g++.dg/cpp1y/constexpr-lifetime6.C | 8 ++++---- gcc/testsuite/g++.dg/warn/Wreturn-local-addr-6.C | 3 --- 6 files changed, 23 insertions(+), 12 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp1y/constexpr-110619.C diff --git a/gcc/cp/semantics.cc b/gcc/cp/semantics.cc index 8fb47fd179e..107407de513 100644 --- a/gcc/cp/semantics.cc +++ b/gcc/cp/semantics.cc @@ -1260,7 +1260,10 @@ finish_return_stmt (tree expr) r = build_stmt (input_location, RETURN_EXPR, expr); if (no_warning) - suppress_warning (r, OPT_Wreturn_type); + { + suppress_warning (r, OPT_Wreturn_type); + suppress_warning (r, OPT_Wdangling_pointer_); + } r = maybe_cleanup_point_expr_void (r); r = add_stmt (r); diff --git a/gcc/cp/typeck.cc b/gcc/cp/typeck.cc index 859b133a18d..47233b3b717 100644 --- a/gcc/cp/typeck.cc +++ b/gcc/cp/typeck.cc @@ -11273,8 +11273,9 @@ check_return_expr (tree retval, bool *no_warning) else if (!processing_template_decl && maybe_warn_about_returning_address_of_local (retval, loc) && INDIRECT_TYPE_P (valtype)) - retval = build2 (COMPOUND_EXPR, TREE_TYPE (retval), retval, - build_zero_cst (TREE_TYPE (retval))); + /* Suppress the Wdangling-pointer warning in the return statement + that would otherwise occur. */ + *no_warning = true; } /* A naive attempt to reduce the number of -Wdangling-reference false diff --git a/gcc/testsuite/g++.dg/cpp1y/constexpr-110619.C b/gcc/testsuite/g++.dg/cpp1y/constexpr-110619.C new file mode 100644 index 00000000000..cca13302238 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/constexpr-110619.C @@ -0,0 +1,10 @@ +// { dg-do compile { target c++14 } } +// { dg-options "-Wno-return-local-addr" } +// PR c++/110619 + +constexpr auto f() { + int i = 0; + return &i; +}; + +static_assert( f() != nullptr ); diff --git a/gcc/testsuite/g++.dg/cpp1y/constexpr-lifetime5.C b/gcc/testsuite/g++.dg/cpp1y/constexpr-lifetime5.C index a4bc71d890a..ad3ef579f63 100644 --- a/gcc/testsuite/g++.dg/cpp1y/constexpr-lifetime5.C +++ b/gcc/testsuite/g++.dg/cpp1y/constexpr-lifetime5.C @@ -1,11 +1,11 @@ // { dg-do compile { target c++14 } } // { dg-options "-Wno-return-local-addr" } -constexpr const int& id(int x) { return x; } +constexpr const int& id(int x) { return x; } // { dg-message "note: declared here" } constexpr bool test() { const int& y = id(3); return y == 3; } -constexpr bool x = test(); // { dg-error "" } +constexpr bool x = test(); // { dg-error "accessing object outside its lifetime" } diff --git a/gcc/testsuite/g++.dg/cpp1y/constexpr-lifetime6.C b/gcc/testsuite/g++.dg/cpp1y/constexpr-lifetime6.C index f358aff4490..b81e89af79c 100644 --- a/gcc/testsuite/g++.dg/cpp1y/constexpr-lifetime6.C +++ b/gcc/testsuite/g++.dg/cpp1y/constexpr-lifetime6.C @@ -4,12 +4,12 @@ struct Empty {}; constexpr const Empty& empty() { - return Empty{}; + return Empty{}; // { dg-message "note: declared here" } } -constexpr const Empty& empty_parm(Empty e) { +constexpr const Empty& empty_parm(Empty e) { // { dg-message "note: declared here" } return e; } -constexpr Empty a = empty(); // { dg-error "" } -constexpr Empty b = empty_parm({}); // { dg-error "" } +constexpr Empty a = empty(); // { dg-error "accessing object outside its lifetime" } +constexpr Empty b = empty_parm({}); // { dg-error "accessing object outside its lifetime" } diff --git a/gcc/testsuite/g++.dg/warn/Wreturn-local-addr-6.C b/gcc/testsuite/g++.dg/warn/Wreturn-local-addr-6.C index fae8b7e766f..ec8e241d83e 100644 --- a/gcc/testsuite/g++.dg/warn/Wreturn-local-addr-6.C +++ b/gcc/testsuite/g++.dg/warn/Wreturn-local-addr-6.C @@ -24,6 +24,3 @@ return_addr_local_as_intref (void) return (const intptr_t&)a; // { dg-warning "\\\[-Wreturn-local-addr]" } */ } - -/* Verify that the return value has been replaced with zero: - { dg-final { scan-tree-dump-times "return 0;" 2 "optimized" } } */ -- 2.41.0