From patchwork Mon Mar 31 13:05:51 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Patrick Palka X-Patchwork-Id: 335307 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id A53831400A2 for ; Tue, 1 Apr 2014 00:06:19 +1100 (EST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:cc:subject:date:message-id; q=dns; s=default; b=nbpZ0bMl4bkh 26vID9u/oW/dLccdi39Ig71nrDrsOD9I+ro8K/ZoaCkxxbw6uco37UEICPNpfDKY vRBx+NpAj36tNoywjqcvu3g3rwQMzMKJf0iX3MnET8voKeER9d79lfmy7DQfOJ00 r4mOJcPvkxonFP/7guX34rDOQAq0sZ0= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:cc:subject:date:message-id; s=default; bh=pNwTEFfH+rYEeJvrsk HoheIN1Gc=; b=bcUBqTyeY8LfPyVGuQpciZlKtWTKmwuvgho+ah/qiJdbzJYv9Q Ooj8RkGlVpSOkW9P4qvGzU6Bu0OvSGDEgZDTPuI3L5LDzpBgBRGMZq8pz4fTYme/ H9yLejaev/t1D2xaD7tWdF38BxnsbWd/6PbgZpdDcK2GG+2P2C0N+Wqjg= Received: (qmail 16361 invoked by alias); 31 Mar 2014 13:06:12 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 16334 invoked by uid 89); 31 Mar 2014 13:06:11 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.9 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.2 X-HELO: mail-qg0-f41.google.com Received: from mail-qg0-f41.google.com (HELO mail-qg0-f41.google.com) (209.85.192.41) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Mon, 31 Mar 2014 13:06:06 +0000 Received: by mail-qg0-f41.google.com with SMTP id z60so79278qgd.14 for ; Mon, 31 Mar 2014 06:06:02 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=5FpThLdzKnTB4cgX18hlsKGgHNAGl550IPW5qbd+FZs=; b=i4TGHt+LR0n6cnZM17wETH1KhUi75yQFtB4CyCLWrILqr8n4euBWAA2QpTNxaX5HKC n77S2gj0SIZYU2/rzdJpM0Cjh2CM1kwvnN2etkDicDKZnZRoR6tyCZ/HDisA4nsZbc7V R7gyPoB2zcw0FPaeqg3Q63kdVdOOvRSexOoWkNFJvoPrBPaIOuXWI9uqRW5/GXfficKV toRID5JkTNzKXnZZUl6qq2GabCFmHxWvRHx0rL/VLaE44Eh7tMGVQvU0cZG+wGyGO3+e ZG4m9gxZCCxMQeA1t0K3t+wAS0gZ+vriKueQqYHaTVODCf7Y/CDqdPXG9EiNKhPBA2/+ jR8w== X-Gm-Message-State: ALoCoQmwKeUcv7I5SSVzk7/DJX0kcR/nudRr3tuuJ0zNu5z72uPcd9n/7YEes6dj1eREOS2WLtrX X-Received: by 10.224.43.71 with SMTP id v7mr2149314qae.92.1396271162877; Mon, 31 Mar 2014 06:06:02 -0700 (PDT) Received: from localhost.localdomain (ool-4353a9c4.dyn.optonline.net. [67.83.169.196]) by mx.google.com with ESMTPSA id z10sm28304921qaf.33.2014.03.31.06.06.00 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 31 Mar 2014 06:06:01 -0700 (PDT) From: Patrick Palka To: gcc-patches@gcc.gnu.org Cc: jason@redhat.com, Patrick Palka Subject: [PATCH] Fix PR c++/44859 Date: Mon, 31 Mar 2014 09:05:51 -0400 Message-Id: <1396271151-12458-1-git-send-email-patrick@parcs.ath.cx> Hi, In PR c++/44859, it is noted that the following code does not emit a "returning reference to temporary" warning: struct Base2 { int m_foo; }; struct Derived2 : public Base2 {}; const Base2& f8() { return Derived2(); } // <-- here The source of the problem seems to be that maybe_warn_about_returning_address_of_local() does not look through COMPONENT_REFs in a function's return value if the function's return type is a REFERENCE_TYPE. This patch simply changes the just mentioned function to look through COMPONENT_REFs (and ARRAY_REFs) unconditionally. This change was successfully bootstrapped and regtested against x86_64-unknown-linux-gnu. 2014-03-31 Patrick Palka patrick@parcs.ath.cx PR c++/44859 * typeck.c (maybe_warn_about_returning_address_of_local): Unwrap COMPONENT_REFs and ARRAY_REFs sooner. --- gcc/cp/typeck.c | 8 ++++---- gcc/testsuite/g++.dg/warn/Wreturn-local-addr-2.C | 11 +++++++++++ 2 files changed, 15 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/g++.dg/warn/Wreturn-local-addr-2.C diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 559f19b5..9a80727 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -8283,6 +8283,10 @@ maybe_warn_about_returning_address_of_local (tree retval) return; whats_returned = TREE_OPERAND (whats_returned, 0); + while (TREE_CODE (whats_returned) == COMPONENT_REF + || TREE_CODE (whats_returned) == ARRAY_REF) + whats_returned = TREE_OPERAND (whats_returned, 0); + if (TREE_CODE (valtype) == REFERENCE_TYPE) { if (TREE_CODE (whats_returned) == AGGR_INIT_EXPR @@ -8300,10 +8304,6 @@ maybe_warn_about_returning_address_of_local (tree retval) } } - while (TREE_CODE (whats_returned) == COMPONENT_REF - || TREE_CODE (whats_returned) == ARRAY_REF) - whats_returned = TREE_OPERAND (whats_returned, 0); - if (DECL_P (whats_returned) && DECL_NAME (whats_returned) && DECL_FUNCTION_SCOPE_P (whats_returned) diff --git a/gcc/testsuite/g++.dg/warn/Wreturn-local-addr-2.C b/gcc/testsuite/g++.dg/warn/Wreturn-local-addr-2.C new file mode 100644 index 0000000..c483601 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wreturn-local-addr-2.C @@ -0,0 +1,11 @@ +// PR c++/44859 + +struct Base2 { int m_foo; }; +struct Derived2 : public Base2 {}; + +const Base2& f8() { return Derived2(); } // { dg-warning "reference to temporary" } + +struct foo { }; +struct bar { foo base; }; + +const foo& f9() { return bar().base; } // { dg-warning "reference to temporary" }