From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2122) id D33233851ABD; Mon, 12 Sep 2022 20:30:04 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org D33233851ABD DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1663014604; bh=RFMfHEjw3yBHtEuZm8kFN0xf2h0I+4I0rtkM9/oEclg=; h=From:To:Subject:Date:From; b=vBP/taQAov2Hp4ehGNHr/tpSOV/IdPC5kR2GDAqD9pAYCY9zvmlF1RCnFBwWtBOpz uc7wfbzc3rDw8fXUVhoza25jlHFJgyPKebbvMXWvvjk8Njtu+k4Y8S/Z02VhYSUbNB p7pWPSFFsZdPlnoH+whHhqJzPEWZOH3rHBm+aupI= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Jason Merrill To: gcc-cvs@gcc.gnu.org Subject: [gcc r12-8759] c++: cast to array of unknown bound [PR93259] X-Act-Checkin: gcc X-Git-Author: Jason Merrill X-Git-Refname: refs/heads/releases/gcc-12 X-Git-Oldrev: 999638cb7b126d33d1ea6548c69ba387b7d7a270 X-Git-Newrev: 8f37a44483870e0db8cd6437ae9716cbe28b7f59 Message-Id: <20220912203004.D33233851ABD@sourceware.org> Date: Mon, 12 Sep 2022 20:30:04 +0000 (GMT) List-Id: https://gcc.gnu.org/g:8f37a44483870e0db8cd6437ae9716cbe28b7f59 commit r12-8759-g8f37a44483870e0db8cd6437ae9716cbe28b7f59 Author: Jason Merrill Date: Mon Sep 12 14:14:24 2022 -0400 c++: cast to array of unknown bound [PR93259] We already know to treat a variable of array-of-unknown-bound type as dependent, we should do the same for arr{}. PR c++/93259 gcc/cp/ChangeLog: * pt.cc (type_dependent_expression_p): Treat a compound literal of array-of-unknown-bound type like a variable. gcc/testsuite/ChangeLog: * g++.dg/cpp0x/initlist-array17.C: New test. Diff: --- gcc/cp/pt.cc | 6 ++--- gcc/testsuite/g++.dg/cpp0x/initlist-array17.C | 37 +++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc index bef31416fb7..2f3cbf4895d 100644 --- a/gcc/cp/pt.cc +++ b/gcc/cp/pt.cc @@ -27952,11 +27952,11 @@ type_dependent_expression_p (tree expression) If the array has no length and has an initializer, it must be that we couldn't determine its length in cp_complete_array_type because it is dependent. */ - if (VAR_P (expression) + if (((VAR_P (expression) && DECL_INITIAL (expression)) + || COMPOUND_LITERAL_P (expression)) && TREE_TYPE (expression) != NULL_TREE && TREE_CODE (TREE_TYPE (expression)) == ARRAY_TYPE - && !TYPE_DOMAIN (TREE_TYPE (expression)) - && DECL_INITIAL (expression)) + && !TYPE_DOMAIN (TREE_TYPE (expression))) return true; /* Pull a FUNCTION_DECL out of a BASELINK if we can. */ diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist-array17.C b/gcc/testsuite/g++.dg/cpp0x/initlist-array17.C new file mode 100644 index 00000000000..c4284a7b391 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist-array17.C @@ -0,0 +1,37 @@ +// PR c++/93259 +// { dg-do compile { target c++11 } } + +template struct is_same; +template struct is_same { }; + +using Array = int[]; + +template +void bar1(Ts ...) +{ + auto && array = Array{ 1, 2, 3 }; + + is_same{}; // this fails, deduces array as int (&&) [] +} + +template +void bar2() +{ + auto && array = Array{ 1, 2, 3 }; + + is_same{}; // this fails, deduces array as int (&&) [] +} + +void bar3() +{ + auto && array = Array{ 1, 2, 3 }; + + is_same{}; // OK +} + +int main() +{ + bar1(1, 2, 3); + bar2(); + bar3(); +}