From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 99316 invoked by alias); 25 Jan 2019 23:22:32 -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 99307 invoked by uid 89); 25 Jan 2019 23:22:32 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-25.9 required=5.0 tests=BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_LAZY_DOMAIN_SECURITY,SPF_HELO_PASS autolearn=ham version=3.3.2 spammy= X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 25 Jan 2019 23:22:30 +0000 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id C5494C7CAD; Fri, 25 Jan 2019 23:22:29 +0000 (UTC) Received: from redhat.com (unknown [10.20.4.51]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 4963860C1C; Fri, 25 Jan 2019 23:22:29 +0000 (UTC) Date: Sat, 26 Jan 2019 01:25:00 -0000 From: Marek Polacek To: Jason Merrill Cc: Tim Song , GCC Patches Subject: Re: C++ PATCH for c++/89024 - ICE with incomplete enum type Message-ID: <20190125232227.GQ26714@redhat.com> References: <20190124191614.GG26714@redhat.com> <20190125170957.GL26714@redhat.com> <8fb80442-9bbc-38fa-5b87-3aa940284fad@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <8fb80442-9bbc-38fa-5b87-3aa940284fad@redhat.com> User-Agent: Mutt/1.10.1 (2018-07-13) X-SW-Source: 2019-01/txt/msg01535.txt.bz2 On Fri, Jan 25, 2019 at 12:14:07PM -0500, Jason Merrill wrote: > On 1/25/19 12:09 PM, Marek Polacek wrote: > > On Fri, Jan 25, 2019 at 10:55:55AM -0600, Tim Song wrote: > > > On Thu, Jan 24, 2019 at 4:14 PM Jason Merrill wrote: > > > > > > > > On 1/24/19 2:16 PM, Marek Polacek wrote: > > > > > This test ICEs since r159006 which added > > > > > > > > > > type = ENUM_UNDERLYING_TYPE (type); > > > > > > > > > > to type_promotes_to. In this test ENUM_UNDERLYING_TYPE is null because we > > > > > haven't yet parsed '}' of the enum and the underlying type isn't fixed, and > > > > > so checking TYPE_UNSIGNED crashed. > > > > > > > > > > I've added some checks to the test to see if the types seem to be OK; clang++ > > > > > agrees. > > > > > > > > > > Bootstrapped/regtested on x86_64-linux, ok for trunk/8/7? > > > > > > > > > > 2019-01-24 Marek Polacek > > > > > > > > > > PR c++/89024 - ICE with incomplete enum type. > > > > > * cvt.c (type_promotes_to): Check if prom is non-null. > > > > > > > > 9.6/6: An enumeration whose underlying type is not fixed is an > > > > incomplete type from its point of declaration to immediately after the > > > > closing } of its enum-specifier, at which point it becomes a complete type. > > > > > > > > So the conversion is ill-formed. > > > > > > > > Jason > > > > > > But the conversion in the example (in > > > decltype(__test_aux<_To1>(declval<_From1>()))) > > > is in a SFINAE context, so shouldn't it gracefully fall back to the > > > `(...)` overload? > > > > I think so, and clang++ and icc also compile the testcase fine (and we used to > > too, before r159006). > > Absolutely, the conversion being ill-formed means substitution fails, and we > reject that candidate. I meant that we shouldn't get as far as > type_promotes_to for an incomplete type. Makes sense. So here's another attempt: Bootstrapped/regtested on x86_64-linux, ok for trunk? 2019-01-25 Marek Polacek PR c++/89024 - ICE with incomplete enum type. * call.c (standard_conversion): When converting an ARITHMETIC_TYPE_P to an incomplete type, return NULL. * g++.dg/cpp0x/enum37.C: New test. diff --git gcc/cp/call.c gcc/cp/call.c index 515a9420032..c74d1b4ebdf 100644 --- gcc/cp/call.c +++ gcc/cp/call.c @@ -1412,6 +1412,13 @@ standard_conversion (tree to, tree from, tree expr, bool c_cast_p, || (fcode == REAL_TYPE && !(flags & LOOKUP_NO_NON_INTEGRAL))) || SCOPED_ENUM_P (from)) return NULL; + + /* If we're parsing an enum with no fixed underlying type, we're + dealing with an incomplete type, which renders the conversion + ill-formed. */ + if (!COMPLETE_TYPE_P (from)) + return NULL; + conv = build_conv (ck_std, to, conv); /* Give this a better rank if it's a promotion. */ diff --git gcc/testsuite/g++.dg/cpp0x/enum37.C gcc/testsuite/g++.dg/cpp0x/enum37.C new file mode 100644 index 00000000000..6aa3d4015d7 --- /dev/null +++ gcc/testsuite/g++.dg/cpp0x/enum37.C @@ -0,0 +1,24 @@ +// PR c++/89024 +// { dg-do compile { target c++11 } } + +template struct same; +template struct same {}; + +template T&& declval(); + +template +void __test_aux(_To1); + +template(declval<_From1>()))> +char __test(int); + +template +int __test(...); + +enum E { + x = decltype(__test(0))(0) +}; + +same s; +same s2;