aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2019-11-22 22:38:44 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2019-11-22 22:38:44 +0100
commitdf418f1d3cba53a4d3d20c2f640a250dd4c1bfa3 (patch)
treef66e383f251a8499f4d34c9d8662bca6f50413af /gcc
parent839e636a9abe65f4880fb5d9609f8ee5ff277fe5 (diff)
downloadgcc-df418f1d3cba53a4d3d20c2f640a250dd4c1bfa3.zip
gcc-df418f1d3cba53a4d3d20c2f640a250dd4c1bfa3.tar.gz
gcc-df418f1d3cba53a4d3d20c2f640a250dd4c1bfa3.tar.bz2
re PR c++/92458 (Constraints do not work with precompiled headers)
PR c++/92458 * tree-hash-traits.h (tree_decl_hash, tree_ssa_name_hash, tree_hash): Move to ... * tree.h (tree_decl_hash, tree_ssa_name_hash, tree_hash): ... here. (struct decl_tree_cache_traits, struct type_tree_cache_traits): New types. (decl_tree_cache_map, tree_tree_cache_map): New typedefs. * init.c (nsdmi_inst): Change type to decl_tree_cache_map * from tree_cache_map *. * constraint.cc (decl_constraints): Likewise. * decl.c (get_tuple_decomp_init): Likewise. * pt.c (defarg_inst, explicit_specifier_map): Likewise. (tsubst_default_argument, store_explicit_specifier): Use decl_tree_cache_map::create_ggc rather than tree_cache_map::create_ggc. * cp-objcp-common.c (debug_type_map): Change type to type_tree_cache_map * from tree_cache_map *. * g++.dg/pch/pr92458.C: New test. * g++.dg/pch/pr92458.Hs: New test. From-SVN: r278633
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/cp/ChangeLog14
-rw-r--r--gcc/cp/constraint.cc2
-rw-r--r--gcc/cp/cp-objcp-common.c2
-rw-r--r--gcc/cp/decl.c2
-rw-r--r--gcc/cp/init.c2
-rw-r--r--gcc/cp/pt.c8
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/pch/pr92458.C5
-rw-r--r--gcc/testsuite/g++.dg/pch/pr92458.Hs7
-rw-r--r--gcc/tree-hash-traits.h40
-rw-r--r--gcc/tree.h64
12 files changed, 112 insertions, 48 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7f7dd00..6ed7aba 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,13 @@
2019-11-22 Jakub Jelinek <jakub@redhat.com>
+ PR c++/92458
+ * tree-hash-traits.h (tree_decl_hash, tree_ssa_name_hash,
+ tree_hash): Move to ...
+ * tree.h (tree_decl_hash, tree_ssa_name_hash, tree_hash): ... here.
+ (struct decl_tree_cache_traits, struct type_tree_cache_traits): New
+ types.
+ (decl_tree_cache_map, tree_tree_cache_map): New typedefs.
+
PR tree-optimization/92618
* tree-ssa-reassoc.c (v_info): Change from auto_vec to a struct
containing the auto_vec and a tree.
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index cd1cd17..93cf9e9 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,17 @@
+2019-11-22 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/92458
+ * init.c (nsdmi_inst): Change type to
+ decl_tree_cache_map * from tree_cache_map *.
+ * constraint.cc (decl_constraints): Likewise.
+ * decl.c (get_tuple_decomp_init): Likewise.
+ * pt.c (defarg_inst, explicit_specifier_map): Likewise.
+ (tsubst_default_argument, store_explicit_specifier): Use
+ decl_tree_cache_map::create_ggc rather than
+ tree_cache_map::create_ggc.
+ * cp-objcp-common.c (debug_type_map): Change type to
+ type_tree_cache_map * from tree_cache_map *.
+
2019-11-21 Marek Polacek <polacek@redhat.com>
PR c++/92450 - ICE with invalid nested name specifier.
diff --git a/gcc/cp/constraint.cc b/gcc/cp/constraint.cc
index 00b59a9..171ca4e 100644
--- a/gcc/cp/constraint.cc
+++ b/gcc/cp/constraint.cc
@@ -1113,7 +1113,7 @@ build_constraints (tree tr, tree dr)
/* A mapping from declarations to constraint information. */
-static GTY ((cache)) tree_cache_map *decl_constraints;
+static GTY ((cache)) decl_tree_cache_map *decl_constraints;
/* Returns the template constraints of declaration T. If T is not
constrained, return NULL_TREE. Note that T must be non-null. */
diff --git a/gcc/cp/cp-objcp-common.c b/gcc/cp/cp-objcp-common.c
index b9bc2c6..d168e2a 100644
--- a/gcc/cp/cp-objcp-common.c
+++ b/gcc/cp/cp-objcp-common.c
@@ -123,7 +123,7 @@ cxx_types_compatible_p (tree x, tree y)
return same_type_ignoring_top_level_qualifiers_p (x, y);
}
-static GTY((cache)) tree_cache_map *debug_type_map;
+static GTY((cache)) type_tree_cache_map *debug_type_map;
/* Return a type to use in the debug info instead of TYPE, or NULL_TREE to
keep TYPE. */
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 86e38f4..2612072 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -7998,7 +7998,7 @@ get_tuple_decomp_init (tree decl, unsigned i)
/* It's impossible to recover the decltype of a tuple decomposition variable
based on the actual type of the variable, so store it in a hash table. */
-static GTY((cache)) tree_cache_map *decomp_type_table;
+static GTY((cache)) decl_tree_cache_map *decomp_type_table;
tree
lookup_decomp_type (tree v)
diff --git a/gcc/cp/init.c b/gcc/cp/init.c
index c620b05..aa48f80 100644
--- a/gcc/cp/init.c
+++ b/gcc/cp/init.c
@@ -548,7 +548,7 @@ perform_target_ctor (tree init)
/* Return the non-static data initializer for FIELD_DECL MEMBER. */
-static GTY((cache)) tree_cache_map *nsdmi_inst;
+static GTY((cache)) decl_tree_cache_map *nsdmi_inst;
tree
get_nsdmi (tree member, bool in_ctor, tsubst_flags_t complain)
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 064fe5b..78b78ba 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -13272,7 +13272,7 @@ tsubst_aggr_type (tree t,
}
}
-static GTY((cache)) tree_cache_map *defarg_inst;
+static GTY((cache)) decl_tree_cache_map *defarg_inst;
/* Substitute into the default argument ARG (a default argument for
FN), which has the indicated TYPE. */
@@ -13346,7 +13346,7 @@ tsubst_default_argument (tree fn, int parmnum, tree type, tree arg,
if (arg != error_mark_node && !cp_unevaluated_operand)
{
if (!defarg_inst)
- defarg_inst = tree_cache_map::create_ggc (37);
+ defarg_inst = decl_tree_cache_map::create_ggc (37);
defarg_inst->put (parm, arg);
}
@@ -13383,7 +13383,7 @@ tsubst_default_arguments (tree fn, tsubst_flags_t complain)
}
/* Hash table mapping a FUNCTION_DECL to its dependent explicit-specifier. */
-static GTY((cache)) tree_cache_map *explicit_specifier_map;
+static GTY((cache)) decl_tree_cache_map *explicit_specifier_map;
/* Store a pair to EXPLICIT_SPECIFIER_MAP. */
@@ -13391,7 +13391,7 @@ void
store_explicit_specifier (tree v, tree t)
{
if (!explicit_specifier_map)
- explicit_specifier_map = tree_cache_map::create_ggc (37);
+ explicit_specifier_map = decl_tree_cache_map::create_ggc (37);
DECL_HAS_DEPENDENT_EXPLICIT_SPEC_P (v) = true;
explicit_specifier_map->put (v, t);
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 1f61bc3..6f8c791 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2019-11-22 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/92458
+ * g++.dg/pch/pr92458.C: New test.
+ * g++.dg/pch/pr92458.Hs: New test.
+
2019-11-22 Iain Sandoe <iain@sandoe.co.uk>
* gcc.target/i386/pr27971.c: Use mdynamic-no-pic for m32 on
diff --git a/gcc/testsuite/g++.dg/pch/pr92458.C b/gcc/testsuite/g++.dg/pch/pr92458.C
new file mode 100644
index 0000000..a750599
--- /dev/null
+++ b/gcc/testsuite/g++.dg/pch/pr92458.C
@@ -0,0 +1,5 @@
+// PR c++/92458
+// { dg-options "-std=c++2a" }
+
+#include "pr92458.H"
+S<int> s;
diff --git a/gcc/testsuite/g++.dg/pch/pr92458.Hs b/gcc/testsuite/g++.dg/pch/pr92458.Hs
new file mode 100644
index 0000000..b81ea63
--- /dev/null
+++ b/gcc/testsuite/g++.dg/pch/pr92458.Hs
@@ -0,0 +1,7 @@
+// PR c++/92458
+// { dg-options "-std=c++2a" }
+
+template<typename T> concept C = sizeof(T) > 1;
+template<typename T> struct S { };
+template<typename T> requires C<T> struct S<T> { };
+template<typename T> requires (!C<T>) struct S<T> { };
diff --git a/gcc/tree-hash-traits.h b/gcc/tree-hash-traits.h
index a3fc024..8c2a839 100644
--- a/gcc/tree-hash-traits.h
+++ b/gcc/tree-hash-traits.h
@@ -41,44 +41,4 @@ tree_operand_hash::equal (const value_type &t1,
return operand_equal_p (t1, t2, 0);
}
-/* Hasher for tree decls. Pointer equality is enough here, but the DECL_UID
- is a better hash than the pointer value and gives a predictable traversal
- order. */
-struct tree_decl_hash : ggc_ptr_hash <tree_node>
-{
- static inline hashval_t hash (tree);
-};
-
-inline hashval_t
-tree_decl_hash::hash (tree t)
-{
- return DECL_UID (t);
-}
-
-/* Hash for SSA_NAMEs in the same function. Pointer equality is enough
- here, but the SSA_NAME_VERSION is a better hash than the pointer
- value and gives a predictable traversal order. */
-struct tree_ssa_name_hash : ggc_ptr_hash <tree_node>
-{
- static inline hashval_t hash (tree);
-};
-
-inline hashval_t
-tree_ssa_name_hash::hash (tree t)
-{
- return SSA_NAME_VERSION (t);
-}
-
-/* Hasher for general trees, based on their TREE_HASH. */
-struct tree_hash : ggc_ptr_hash <tree_node>
-{
- static hashval_t hash (tree);
-};
-
-inline hashval_t
-tree_hash::hash (tree t)
-{
- return TREE_HASH (t);
-}
-
#endif
diff --git a/gcc/tree.h b/gcc/tree.h
index 89114e2..60b6eae 100644
--- a/gcc/tree.h
+++ b/gcc/tree.h
@@ -5351,6 +5351,58 @@ struct tree_decl_map_cache_hasher : ggc_cache_ptr_hash<tree_decl_map>
#define tree_vec_map_hash tree_decl_map_hash
#define tree_vec_map_marked_p tree_map_base_marked_p
+/* Hasher for tree decls. Pointer equality is enough here, but the DECL_UID
+ is a better hash than the pointer value and gives a predictable traversal
+ order. Additionally it can be used across PCH save/restore. */
+struct tree_decl_hash : ggc_ptr_hash <tree_node>
+{
+ static inline hashval_t hash (tree);
+};
+
+inline hashval_t
+tree_decl_hash::hash (tree t)
+{
+ return DECL_UID (t);
+}
+
+/* Similarly for types. Uses TYPE_UID as hash function. */
+struct tree_type_hash : ggc_ptr_hash <tree_node>
+{
+ static inline hashval_t hash (tree);
+};
+
+inline hashval_t
+tree_type_hash::hash (tree t)
+{
+ return TYPE_UID (t);
+}
+
+/* Hash for SSA_NAMEs in the same function. Pointer equality is enough
+ here, but the SSA_NAME_VERSION is a better hash than the pointer
+ value and gives a predictable traversal order. */
+struct tree_ssa_name_hash : ggc_ptr_hash <tree_node>
+{
+ static inline hashval_t hash (tree);
+};
+
+inline hashval_t
+tree_ssa_name_hash::hash (tree t)
+{
+ return SSA_NAME_VERSION (t);
+}
+
+/* Hasher for general trees, based on their TREE_HASH. */
+struct tree_hash : ggc_ptr_hash <tree_node>
+{
+ static hashval_t hash (tree);
+};
+
+inline hashval_t
+tree_hash::hash (tree t)
+{
+ return TREE_HASH (t);
+}
+
/* A hash_map of two trees for use with GTY((cache)). Garbage collection for
such a map will not mark keys, and will mark values if the key is already
marked. */
@@ -5358,6 +5410,18 @@ struct tree_cache_traits
: simple_cache_map_traits<default_hash_traits<tree>, tree> { };
typedef hash_map<tree,tree,tree_cache_traits> tree_cache_map;
+/* Similarly, but use DECL_UID as hash function rather than pointer hashing.
+ This is for hash_maps from decls to trees that need to work across PCH. */
+struct decl_tree_cache_traits
+ : simple_cache_map_traits<tree_decl_hash, tree> { };
+typedef hash_map<tree,tree,decl_tree_cache_traits> decl_tree_cache_map;
+
+/* Similarly, but use TYPE_UID as hash function rather than pointer hashing.
+ This is for hash_maps from types to trees that need to work across PCH. */
+struct type_tree_cache_traits
+ : simple_cache_map_traits<tree_type_hash, tree> { };
+typedef hash_map<tree,tree,type_tree_cache_traits> type_tree_cache_map;
+
/* Initialize the abstract argument list iterator object ITER with the
arguments from CALL_EXPR node EXP. */
static inline void