diff options
author | Nathan Sidwell <nathan@acm.org> | 2017-11-29 13:22:44 +0000 |
---|---|---|
committer | Nathan Sidwell <nathan@gcc.gnu.org> | 2017-11-29 13:22:44 +0000 |
commit | b7f592fc5d0770f7cebe2d45843538b37077175c (patch) | |
tree | e93b3900066167507691eaf08ec9e34857ed8fd2 /gcc/tree.c | |
parent | e69a816d8f323ba1f2660480da8e73ef3b30780d (diff) | |
download | gcc-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.c | 93 |
1 files changed, 47 insertions, 46 deletions
@@ -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)); |