re PR c++/57016 ([C++0x] ICE: unexpected expression '__is_final(hash<int>)' of kind trait_expr)
PR c++/57016 * pt.c (instantiation_dependent_r) [TRAIT_EXPR]: Only check type2 if there is one. From-SVN: r199126
This commit is contained in:
parent
6e5fba0ef6
commit
a31ed47cf0
@ -1,5 +1,9 @@
|
||||
2013-05-20 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/57016
|
||||
* pt.c (instantiation_dependent_r) [TRAIT_EXPR]: Only check type2
|
||||
if there is one.
|
||||
|
||||
PR c++/57102
|
||||
* decl.c (fndecl_declared_return_type): Also look in
|
||||
DECL_SAVED_FUNCTION_DATA.
|
||||
|
@ -20177,7 +20177,8 @@ instantiation_dependent_r (tree *tp, int *walk_subtrees,
|
||||
|
||||
case TRAIT_EXPR:
|
||||
if (dependent_type_p (TRAIT_EXPR_TYPE1 (*tp))
|
||||
|| dependent_type_p (TRAIT_EXPR_TYPE2 (*tp)))
|
||||
|| (TRAIT_EXPR_TYPE2 (*tp)
|
||||
&& dependent_type_p (TRAIT_EXPR_TYPE2 (*tp))))
|
||||
return *tp;
|
||||
*walk_subtrees = false;
|
||||
return NULL_TREE;
|
||||
|
133
gcc/testsuite/g++.dg/cpp0x/traits1.C
Normal file
133
gcc/testsuite/g++.dg/cpp0x/traits1.C
Normal file
@ -0,0 +1,133 @@
|
||||
// PR c++/57016
|
||||
// { dg-require-effective-target c++11 }
|
||||
|
||||
template < typename _Tp, _Tp __v > struct integral_constant
|
||||
{
|
||||
static constexpr _Tp value = __v;
|
||||
};
|
||||
template < bool, typename, typename > struct conditional;
|
||||
template < typename ... >struct __and_;
|
||||
template
|
||||
<
|
||||
typename
|
||||
_B1,
|
||||
typename
|
||||
_B2 > struct __and_ <_B1, _B2 >:conditional < _B1::value, _B2, _B1 >::type
|
||||
{};
|
||||
template < typename _Pp > struct __not_:integral_constant < bool, _Pp::value >
|
||||
{};
|
||||
template < typename > struct add_rvalue_reference;
|
||||
template
|
||||
< typename _Tp > typename add_rvalue_reference < _Tp >::type declval ();
|
||||
template < bool, typename _Iftrue, typename > struct conditional
|
||||
{
|
||||
typedef _Iftrue type;
|
||||
};
|
||||
template < class, class > struct pair;
|
||||
template < typename > class allocator;
|
||||
template < typename, typename, typename > struct binary_function;
|
||||
template < typename _Tp > struct equal_to:binary_function < _Tp, _Tp, bool >
|
||||
{};
|
||||
template < typename > struct hash;
|
||||
template < >struct hash <int >
|
||||
{};
|
||||
template
|
||||
<
|
||||
typename,
|
||||
typename,
|
||||
typename,
|
||||
typename, typename, typename, typename, typename > struct _Hashtable_base;
|
||||
template
|
||||
<
|
||||
typename,
|
||||
typename
|
||||
> struct __is_noexcept_hash:integral_constant < bool, noexcept ((declval)) >
|
||||
{}
|
||||
;
|
||||
struct _Identity;
|
||||
template < bool, bool _Constant_iterators, bool > struct _Hashtable_traits
|
||||
;
|
||||
struct _Mod_range_hashing;
|
||||
struct _Default_ranged_hash;
|
||||
struct _Prime_rehash_policy;
|
||||
template
|
||||
<
|
||||
typename
|
||||
_Tp,
|
||||
typename
|
||||
_Hash
|
||||
>
|
||||
using
|
||||
__cache_default
|
||||
=
|
||||
__not_
|
||||
<
|
||||
__and_
|
||||
<
|
||||
integral_constant
|
||||
< bool, __is_final (_Hash) >, __is_noexcept_hash < _Tp, _Hash > >>;
|
||||
template < typename _Key, typename _Value, typename, typename _ExtractKey, typename _Equal, typename _H1, typename _H2, typename, typename _RehashPolicy, typename _Traits > class _Hashtable:
|
||||
_Hashtable_base
|
||||
< _Key, _Value, _ExtractKey, _Equal, _H1, _H2, _RehashPolicy, _Traits >
|
||||
{}
|
||||
;
|
||||
template
|
||||
<
|
||||
bool
|
||||
_Cache > using __uset_traits = _Hashtable_traits < _Cache, true, true >;
|
||||
template
|
||||
<
|
||||
typename
|
||||
_Value,
|
||||
typename
|
||||
_Hash
|
||||
=
|
||||
hash
|
||||
<
|
||||
_Value
|
||||
>,
|
||||
typename
|
||||
_Pred
|
||||
=
|
||||
equal_to
|
||||
<
|
||||
_Value
|
||||
>,
|
||||
typename
|
||||
_Alloc
|
||||
=
|
||||
allocator
|
||||
<
|
||||
_Value
|
||||
>,
|
||||
typename
|
||||
_Tr
|
||||
=
|
||||
__uset_traits
|
||||
<
|
||||
__cache_default
|
||||
<
|
||||
_Value,
|
||||
_Hash
|
||||
>::value
|
||||
>
|
||||
>
|
||||
using
|
||||
__uset_hashtable
|
||||
=
|
||||
_Hashtable
|
||||
<
|
||||
_Value,
|
||||
_Value,
|
||||
_Alloc,
|
||||
_Identity,
|
||||
_Pred,
|
||||
_Hash,
|
||||
_Mod_range_hashing, _Default_ranged_hash, _Prime_rehash_policy, _Tr >;
|
||||
template < class _Value, class = hash < _Value > >class unordered_set
|
||||
{
|
||||
typedef __uset_hashtable < _Value > iterator;
|
||||
template < typename > pair < iterator, bool > emplace ();
|
||||
}
|
||||
;
|
||||
template class unordered_set < int >;
|
Loading…
Reference in New Issue
Block a user