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.

From-SVN: r268320
This commit is contained in:
Marek Polacek 2019-01-27 19:54:29 +00:00 committed by Marek Polacek
parent 9faf6e7018
commit 73a54a6193
4 changed files with 42 additions and 0 deletions

View File

@ -1,3 +1,9 @@
2019-01-27 Marek Polacek <polacek@redhat.com>
PR c++/89024 - ICE with incomplete enum type.
* call.c (standard_conversion): When converting an
ARITHMETIC_TYPE_P to an incomplete type, return NULL.
2019-01-25 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/88969

View File

@ -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. */

View File

@ -1,3 +1,8 @@
2019-01-27 Marek Polacek <polacek@redhat.com>
PR c++/89024 - ICE with incomplete enum type.
* g++.dg/cpp0x/enum37.C: New test.
2019-01-27 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/opt75.adb: New test.

View File

@ -0,0 +1,24 @@
// PR c++/89024
// { dg-do compile { target c++11 } }
template <class T, class U> struct same;
template <class T> struct same<T,T> {};
template<class T> T&& declval();
template<typename _To1>
void __test_aux(_To1);
template<typename _From1, typename _To1,
typename = decltype(__test_aux<_To1>(declval<_From1>()))>
char __test(int);
template<typename, typename>
int __test(...);
enum E {
x = decltype(__test<E, int>(0))(0)
};
same<E,decltype(x)> s;
same<unsigned int,__underlying_type(E)> s2;