aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@gcc.gnu.org>2010-10-11 09:25:37 -0400
committerJason Merrill <jason@gcc.gnu.org>2010-10-11 09:25:37 -0400
commit9c3c8ad74024641107dc60942263e502371eb50b (patch)
treeb3746a8c2d5dee63f0cbc52c321f3735ed994ecd /gcc
parentd6d5951a4a7f3ed219ea5be8c9a377cfb16f62d8 (diff)
downloadgcc-9c3c8ad74024641107dc60942263e502371eb50b.zip
gcc-9c3c8ad74024641107dc60942263e502371eb50b.tar.gz
gcc-9c3c8ad74024641107dc60942263e502371eb50b.tar.bz2
re PR lto/45959 (ICE: tree code 'template_type_parm' is not supported in gimple streams with -flto/-fwhopr)
PR lto/45959 PR lto/45960 * pt.c (tsubst_copy) [INTEGER_CST]: Instantiate the type. From-SVN: r165306
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/pt.c11
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/lto/20101010-1_0.C109
-rw-r--r--gcc/testsuite/g++.dg/lto/20101010-2_0.C32
5 files changed, 163 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 9928f61..0bf00e7 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2010-10-10 Jason Merrill <jason@redhat.com>
+
+ PR lto/45959
+ PR lto/45960
+ * pt.c (tsubst_copy) [INTEGER_CST]: Instantiate the type.
+
2010-10-07 Andi Kleen <ak@linux.intel.com>
* Make-lang.in (c++_OBJS): Remove dummy-checksum.o.
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 9afa74d..b84cc78 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -11373,6 +11373,17 @@ tsubst_copy (tree t, tree args, tsubst_flags_t complain, tree in_decl)
error ("use %<...%> to expand argument pack");
return error_mark_node;
+ case INTEGER_CST:
+ case REAL_CST:
+ case STRING_CST:
+ {
+ /* Instantiate any typedefs in the type. */
+ tree type = tsubst (TREE_TYPE (t), args, complain, in_decl);
+ r = fold_convert (type, t);
+ gcc_assert (TREE_CODE (r) == code);
+ return r;
+ }
+
default:
return t;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 315e688..c6ab6da 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2010-10-10 Richard Guenther <rguenther@suse.de>
+
+ * g++.dg/lto/20101010-1_0.C: New testcase.
+ * g++.dg/lto/20101010-2_0.C: Likewise.
+
2010-10-11 Ira Rosen <irar@il.ibm.com>
PR tree-optimization/45902
diff --git a/gcc/testsuite/g++.dg/lto/20101010-1_0.C b/gcc/testsuite/g++.dg/lto/20101010-1_0.C
new file mode 100644
index 0000000..6eb40ef
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lto/20101010-1_0.C
@@ -0,0 +1,109 @@
+// { dg-lto-do link }
+
+typedef long size_t;
+template < class, class > struct pair
+{
+}
+;
+template < typename > class allocator;
+template < typename > struct equal_to;
+
+template < class > struct hash;
+template
+<
+class, class, class, class, class, class > struct dense_hashtable_iterator;
+template
+<
+class,
+ class, class, class, class, class > struct dense_hashtable_const_iterator;
+template
+<
+class
+Value,
+ class
+ Key,
+ class
+ HashFcn,
+ class ExtractKey, class EqualKey, class Alloc > class dense_hashtable
+{
+public:
+ typedef Key key_type;
+ typedef Value value_type;
+ typedef size_t size_type;
+ typedef
+ dense_hashtable_iterator
+ < Value, Key, HashFcn, ExtractKey, EqualKey, Alloc > iterator;
+ typedef
+ dense_hashtable_const_iterator
+ < Value, Key, HashFcn, ExtractKey, EqualKey, Alloc > const_iterator;
+ static const size_type ILLEGAL_BUCKET = (-1);
+ pair < size_type, size_type > find_position (key_type)
+ {
+ size_type insert_pos = ILLEGAL_BUCKET;
+ }
+ pair < iterator, bool > insert_noresize (value_type obj)
+ {
+ pair < size_type, size_type > pos = find_position ((obj));
+ }
+ pair < iterator, bool > insert (value_type & obj)
+ {
+ insert_noresize (obj);
+ }
+ ExtractKey get_key;
+}
+
+;
+template
+<
+class
+Value,
+ class
+ HashFcn
+ =
+ hash
+ <
+ Value
+ >,
+ class
+ EqualKey
+ =
+ equal_to < Value >, class Alloc = allocator < Value > >class dense_hash_set
+{
+ struct Identity
+ {
+ }
+ ;
+ typedef
+ dense_hashtable < Value, Value, HashFcn, Identity, EqualKey, Alloc > ht;
+ ht rep;
+public:
+ typedef typename ht::value_type value_type;
+ typedef typename ht::const_iterator iterator;
+ pair < iterator, bool > insert (value_type obj)
+ {
+ pair < typename ht::iterator, bool > p = rep.insert (obj);
+ }
+}
+
+;
+class blah_46
+{
+}
+;
+struct foo_10:dense_hash_set < blah_46 >
+{
+}
+;
+class foo_14
+{
+ void hmmmmh_5 (blah_46);
+ foo_10 negative_rrrrrrr_type_data_;
+}
+;
+void
+foo_14::hmmmmh_5 (blah_46 hahaha_id)
+{
+ negative_rrrrrrr_type_data_.insert (hahaha_id);
+}
+
+int main () { return 0; }
diff --git a/gcc/testsuite/g++.dg/lto/20101010-2_0.C b/gcc/testsuite/g++.dg/lto/20101010-2_0.C
new file mode 100644
index 0000000..c68bcd6
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lto/20101010-2_0.C
@@ -0,0 +1,32 @@
+// { dg-lto-do link }
+
+typedef int size_t;
+template < size_t _Nw > struct _Base_bitset
+{
+ typedef unsigned _WordT;
+ _WordT _M_w[_Nw];
+ void _M_do_set ()
+ {
+ for (size_t __i;;)
+ _M_w[__i] = static_cast < _WordT > (0);
+ }
+};
+
+template < size_t > class bitset:
+_Base_bitset < ((sizeof (unsigned)) + ((sizeof (unsigned)) ? : 1)) >
+{
+public:
+ bitset set ()
+ {
+ _M_do_set ();
+ }
+};
+
+void
+test01 ()
+{
+ bitset < 96 > z6;
+ z6.set ();
+}
+
+int main() { return 0; }