aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree.c
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@acm.org>2017-11-29 13:22:44 +0000
committerNathan Sidwell <nathan@gcc.gnu.org>2017-11-29 13:22:44 +0000
commitb7f592fc5d0770f7cebe2d45843538b37077175c (patch)
treee93b3900066167507691eaf08ec9e34857ed8fd2 /gcc/tree.c
parente69a816d8f323ba1f2660480da8e73ef3b30780d (diff)
downloadgcc-b7f592fc5d0770f7cebe2d45843538b37077175c.zip
gcc-b7f592fc5d0770f7cebe2d45843538b37077175c.tar.gz
gcc-b7f592fc5d0770f7cebe2d45843538b37077175c.tar.bz2
[PATCH] complex type canonicalization
https://gcc.gnu.org/ml/gcc-patches/2017-11/msg02453.html PR c++/83817 * tree.c (build_complex_type): Fix canonicalization. Only fill in type if it is new. PR c++/83187 * g++.dg/opt/pr83187.C: New. From-SVN: r255231
Diffstat (limited to 'gcc/tree.c')
-rw-r--r--gcc/tree.c93
1 files changed, 47 insertions, 46 deletions
diff --git a/gcc/tree.c b/gcc/tree.c
index b390247..5416866 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -8083,65 +8083,66 @@ build_offset_type (tree basetype, tree type)
tree
build_complex_type (tree component_type, bool named)
{
- tree t;
-
gcc_assert (INTEGRAL_TYPE_P (component_type)
|| SCALAR_FLOAT_TYPE_P (component_type)
|| FIXED_POINT_TYPE_P (component_type));
/* Make a node of the sort we want. */
- t = make_node (COMPLEX_TYPE);
+ tree probe = make_node (COMPLEX_TYPE);
- TREE_TYPE (t) = TYPE_MAIN_VARIANT (component_type);
+ TREE_TYPE (probe) = TYPE_MAIN_VARIANT (component_type);
/* If we already have such a type, use the old one. */
- hashval_t hash = type_hash_canon_hash (t);
- t = type_hash_canon (hash, t);
-
- if (!COMPLETE_TYPE_P (t))
- layout_type (t);
+ hashval_t hash = type_hash_canon_hash (probe);
+ tree t = type_hash_canon (hash, probe);
- if (TYPE_CANONICAL (t) == t)
+ if (t == probe)
{
- if (TYPE_STRUCTURAL_EQUALITY_P (component_type))
+ /* We created a new type. The hash insertion will have laid
+ out the type. We need to check the canonicalization and
+ maybe set the name. */
+ gcc_checking_assert (COMPLETE_TYPE_P (t)
+ && !TYPE_NAME (t)
+ && TYPE_CANONICAL (t) == t);
+
+ if (TYPE_STRUCTURAL_EQUALITY_P (TREE_TYPE (t)))
SET_TYPE_STRUCTURAL_EQUALITY (t);
- else if (TYPE_CANONICAL (component_type) != component_type)
+ else if (TYPE_CANONICAL (TREE_TYPE (t)) != TREE_TYPE (t))
TYPE_CANONICAL (t)
- = build_complex_type (TYPE_CANONICAL (component_type), named);
- }
-
- /* We need to create a name, since complex is a fundamental type. */
- if (!TYPE_NAME (t) && named)
- {
- const char *name;
- if (component_type == char_type_node)
- name = "complex char";
- else if (component_type == signed_char_type_node)
- name = "complex signed char";
- else if (component_type == unsigned_char_type_node)
- name = "complex unsigned char";
- else if (component_type == short_integer_type_node)
- name = "complex short int";
- else if (component_type == short_unsigned_type_node)
- name = "complex short unsigned int";
- else if (component_type == integer_type_node)
- name = "complex int";
- else if (component_type == unsigned_type_node)
- name = "complex unsigned int";
- else if (component_type == long_integer_type_node)
- name = "complex long int";
- else if (component_type == long_unsigned_type_node)
- name = "complex long unsigned int";
- else if (component_type == long_long_integer_type_node)
- name = "complex long long int";
- else if (component_type == long_long_unsigned_type_node)
- name = "complex long long unsigned int";
- else
- name = 0;
+ = build_complex_type (TYPE_CANONICAL (TREE_TYPE (t)), named);
- if (name != 0)
- TYPE_NAME (t) = build_decl (UNKNOWN_LOCATION, TYPE_DECL,
- get_identifier (name), t);
+ /* We need to create a name, since complex is a fundamental type. */
+ if (named)
+ {
+ const char *name = NULL;
+
+ if (TREE_TYPE (t) == char_type_node)
+ name = "complex char";
+ else if (TREE_TYPE (t) == signed_char_type_node)
+ name = "complex signed char";
+ else if (TREE_TYPE (t) == unsigned_char_type_node)
+ name = "complex unsigned char";
+ else if (TREE_TYPE (t) == short_integer_type_node)
+ name = "complex short int";
+ else if (TREE_TYPE (t) == short_unsigned_type_node)
+ name = "complex short unsigned int";
+ else if (TREE_TYPE (t) == integer_type_node)
+ name = "complex int";
+ else if (TREE_TYPE (t) == unsigned_type_node)
+ name = "complex unsigned int";
+ else if (TREE_TYPE (t) == long_integer_type_node)
+ name = "complex long int";
+ else if (TREE_TYPE (t) == long_unsigned_type_node)
+ name = "complex long unsigned int";
+ else if (TREE_TYPE (t) == long_long_integer_type_node)
+ name = "complex long long int";
+ else if (TREE_TYPE (t) == long_long_unsigned_type_node)
+ name = "complex long long unsigned int";
+
+ if (name != NULL)
+ TYPE_NAME (t) = build_decl (UNKNOWN_LOCATION, TYPE_DECL,
+ get_identifier (name), t);
+ }
}
return build_qualified_type (t, TYPE_QUALS (component_type));