From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 51505 invoked by alias); 16 Dec 2015 22:10:17 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 51489 invoked by uid 89); 16 Dec 2015 22:10:16 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.0 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_LOW autolearn=ham version=3.3.2 spammy=Hx-languages-length:4951 X-HELO: mail-qk0-f177.google.com Received: from mail-qk0-f177.google.com (HELO mail-qk0-f177.google.com) (209.85.220.177) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Wed, 16 Dec 2015 22:10:15 +0000 Received: by mail-qk0-f177.google.com with SMTP id p187so88238965qkd.1 for ; Wed, 16 Dec 2015 14:10:15 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:date:to:cc:subject:in-reply-to:message-id :references:user-agent:mime-version:content-type; bh=LKY83ZzN8p74/l7lUD60dFO4hpkHPYq+O1y53INKNIk=; b=iGbpqJWTRkZGiau5uItMum+wTRdkowvVqArZflbORUqBSnGYRWeu8ghU81Ifh+EzoS MAz355lJ61QTybx7ukAv2/b3ciCTzUIgKBrKcb5pO5lYdjv+AT+bnBt4KWKvuTwwSZzD joKQfB34PRBPctSk1ZGZOelNck6vi4VH8VnOr/jPIxOCQFyV/ul0hdFQaDBC5VrPPvLi tJftIPC+aYuj9v4+jAkIWulGlTpvY4XxJ6YxUkmL8efU/jC0bwaEbEctfBDCikiYwtT3 uYf8npGaK/d/t8VZ8LuxHGx/gOdYFaN9dfrIOY+q9AhDbYIdOmA0MM8PDAa4kP7L8Sli 1KUw== X-Gm-Message-State: ALoCoQn8MS/4mwoTxiHUEZuR7UxSWD0P0GxNt9j6jHcy9U1+v/OBjWPrIVPvBEWo48FgJLoJ0pR1G9lv7m14WhAcon+7zStWsQ== X-Received: by 10.55.41.138 with SMTP id p10mr62465153qkp.18.1450303813456; Wed, 16 Dec 2015 14:10:13 -0800 (PST) Received: from [192.168.1.130] (ool-4353a8be.dyn.optonline.net. [67.83.168.190]) by smtp.gmail.com with ESMTPSA id r71sm3397979qha.9.2015.12.16.14.10.12 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 16 Dec 2015 14:10:12 -0800 (PST) From: Patrick Palka X-Google-Original-From: Patrick Palka Date: Wed, 16 Dec 2015 22:10:00 -0000 To: Jason Merrill cc: Patrick Palka , gcc-patches@gcc.gnu.org Subject: Re: [PATCH] Fix some blockers of PR c++/24666 (arrays decay to pointers too early) In-Reply-To: <5671D92F.1000104@redhat.com> Message-ID: References: <1450214192-23542-1-git-send-email-patrick@parcs.ath.cx> <5671D92F.1000104@redhat.com> User-Agent: Alpine 2.20.9 (DEB 106 2015-09-22) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII; format=flowed X-SW-Source: 2015-12/txt/msg01670.txt.bz2 On Wed, 16 Dec 2015, Jason Merrill wrote: > On 12/15/2015 04:16 PM, Patrick Palka wrote: >> + if (MAYBE_CLASS_TYPE_P (type)) >> + ; > > What does this patch do with conversion to const reference to class? I think > we want to check MAYBE_CLASS_TYPE_P (non_reference (type)) here. That makes sense. Here's an updated patch using non_reference, with tests updated to each have a reference-returning variant. -- 8< -- gcc/cp/ChangeLog: PR c++/16333 PR c++/41426 PR c++/59878 PR c++/66895 * typeck.c (convert_for_initialization): Don't perform an early decaying conversion if converting to a class type. gcc/testsuite/ChangeLog: PR c++/16333 PR c++/41426 PR c++/59878 PR c++/66895 * g++.dg/conversion/pr16333.C: New test. * g++.dg/conversion/pr41426.C: New test. * g++.dg/conversion/pr59878.C: New test. * g++.dg/conversion/pr66895.C: New test. --- gcc/cp/typeck.c | 16 +++++++------ gcc/testsuite/g++.dg/conversion/pr16333.C | 10 ++++++++ gcc/testsuite/g++.dg/conversion/pr41426.C | 40 +++++++++++++++++++++++++++++++ gcc/testsuite/g++.dg/conversion/pr59878.C | 25 +++++++++++++++++++ gcc/testsuite/g++.dg/conversion/pr66895.C | 16 +++++++++++++ 5 files changed, 100 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/g++.dg/conversion/pr16333.C create mode 100644 gcc/testsuite/g++.dg/conversion/pr41426.C create mode 100644 gcc/testsuite/g++.dg/conversion/pr59878.C create mode 100644 gcc/testsuite/g++.dg/conversion/pr66895.C diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 39c1af2..a06ecf0 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -8479,13 +8479,15 @@ convert_for_initialization (tree exp, tree type, tree rhs, int flags, || (TREE_CODE (rhs) == TREE_LIST && TREE_VALUE (rhs) == error_mark_node)) return error_mark_node; - if ((TREE_CODE (TREE_TYPE (rhs)) == ARRAY_TYPE - && TREE_CODE (type) != ARRAY_TYPE - && (TREE_CODE (type) != REFERENCE_TYPE - || TREE_CODE (TREE_TYPE (type)) != ARRAY_TYPE)) - || (TREE_CODE (TREE_TYPE (rhs)) == FUNCTION_TYPE - && !TYPE_REFFN_P (type)) - || TREE_CODE (TREE_TYPE (rhs)) == METHOD_TYPE) + if (MAYBE_CLASS_TYPE_P (non_reference (type))) + ; + else if ((TREE_CODE (TREE_TYPE (rhs)) == ARRAY_TYPE + && TREE_CODE (type) != ARRAY_TYPE + && (TREE_CODE (type) != REFERENCE_TYPE + || TREE_CODE (TREE_TYPE (type)) != ARRAY_TYPE)) + || (TREE_CODE (TREE_TYPE (rhs)) == FUNCTION_TYPE + && !TYPE_REFFN_P (type)) + || TREE_CODE (TREE_TYPE (rhs)) == METHOD_TYPE) rhs = decay_conversion (rhs, complain); rhstype = TREE_TYPE (rhs); diff --git a/gcc/testsuite/g++.dg/conversion/pr16333.C b/gcc/testsuite/g++.dg/conversion/pr16333.C new file mode 100644 index 0000000..810c12a --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/pr16333.C @@ -0,0 +1,10 @@ +// PR c++/16333 + +struct X { + X (const int (&)[3]); +}; + +int a[3]; +X foo1 () { return a; } +const X &foo2 () { return a; } // { dg-warning "returning reference to temporary" } +X &foo3 () { return a; } // { dg-error "invalid initialization" } diff --git a/gcc/testsuite/g++.dg/conversion/pr41426.C b/gcc/testsuite/g++.dg/conversion/pr41426.C new file mode 100644 index 0000000..78ec5fb --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/pr41426.C @@ -0,0 +1,40 @@ +// PR c++/41426 + +template +struct A +{ + template + A(_T (&V)[_N]); + A(); +}; + +A g1() +{ + float f[] = {1.1f, 2.3f}; + return f; +} + +const A &g3() +{ + float f[] = {1.1f, 2.3f}; + return f; // { dg-warning "returning reference to temporary" } +} + +A &g4() +{ + float f[] = {1.1f, 2.3f}; + return f; // { dg-error "invalid initialization" } +} + +struct B +{ + B (int (&v)[10]); + B(); +}; + +B g2() +{ + int c[10]; + return c; +} + diff --git a/gcc/testsuite/g++.dg/conversion/pr59878.C b/gcc/testsuite/g++.dg/conversion/pr59878.C new file mode 100644 index 0000000..ed567fe --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/pr59878.C @@ -0,0 +1,25 @@ +// PR c++/59878 + +struct Test { + template + Test(const char (&array)[N]) {} +}; + +Test test() { + return "test1"; +} + +void test2(Test arg = "test12") {} + +template +void test3(T arg = "test123") {} + +template +void test4(const T &arg = "test123") {} + +int main() { + test(); + test2(); + test3(); + test4(); +} diff --git a/gcc/testsuite/g++.dg/conversion/pr66895.C b/gcc/testsuite/g++.dg/conversion/pr66895.C new file mode 100644 index 0000000..14203bd --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/pr66895.C @@ -0,0 +1,16 @@ +// PR c++/66895 +// { dg-do compile { target c++11 } } + +#include +#include + +struct S { + template S(char const (&)[N]); +}; +struct T1 { S s; }; +void f1(std::initializer_list); +void g1() { f1({{""}}); } + +struct T2 { const S& s; }; +void f2(std::initializer_list); +void g2() { f2({{""}}); } -- 2.7.0.rc0.50.g1470d8f.dirty