Patchwork C++ PATCH for c++/57016 (ICE with __is_final trait)

login
register
mail settings
Submitter Jason Merrill
Date May 20, 2013, 9:32 p.m.
Message ID <519A9681.5010504@redhat.com>
Download mbox | patch
Permalink /patch/245119/
State New
Headers show

Comments

Jason Merrill - May 20, 2013, 9:32 p.m.
instantiation_dependent_r was treating a null trait type as dependent.

Tested x86_64-pc-linux-gnu, applying to trunk.

Patch

commit e0c77ebb435f3910ac533df1c7578e6fcb3ec306
Author: Jason Merrill <jason@redhat.com>
Date:   Mon May 20 14:48:52 2013 -0400

    	PR c++/57016
    	* pt.c (instantiation_dependent_r) [TRAIT_EXPR]: Only check type2
    	if there is one.

diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 35989a4..f861f4c 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -20207,7 +20207,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;
diff --git a/gcc/testsuite/g++.dg/cpp0x/traits1.C b/gcc/testsuite/g++.dg/cpp0x/traits1.C
new file mode 100644
index 0000000..9085b71
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/traits1.C
@@ -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 >;