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.
+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.
/* 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. */
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. */
/* 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)
/* 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)
}
}
-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. */
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);
}
}
/* 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. */
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);
}
+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
--- /dev/null
+// PR c++/92458
+// { dg-options "-std=c++2a" }
+
+#include "pr92458.H"
+S<int> s;
--- /dev/null
+// 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> { };
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
#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. */
: 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