diff options
Diffstat (limited to 'gcc/cp/pt.cc')
-rw-r--r-- | gcc/cp/pt.cc | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc index 538ff22..1f5ab4e 100644 --- a/gcc/cp/pt.cc +++ b/gcc/cp/pt.cc @@ -12134,13 +12134,18 @@ tsubst_attribute (tree t, tree *decl_p, tree args, location_t match_loc = cp_expr_loc_or_input_loc (TREE_PURPOSE (chain)); tree ctx = copy_list (TREE_VALUE (val)); tree append_args_list = TREE_CHAIN (TREE_CHAIN (chain)); - if (append_args_list && TREE_VALUE (append_args_list)) + if (append_args_list + && TREE_VALUE (append_args_list) + && TREE_CHAIN (TREE_VALUE (append_args_list))) { - append_args_list = TREE_VALUE (TREE_VALUE (append_args_list)); + append_args_list = TREE_VALUE (append_args_list); + append_args_list = TREE_VALUE (TREE_CHAIN (append_args_list)); for (; append_args_list; append_args_list = TREE_CHAIN (append_args_list)) { tree pref_list = TREE_VALUE (append_args_list); + if (pref_list == NULL_TREE || TREE_CODE (pref_list) != TREE_LIST) + continue; tree fr_list = TREE_VALUE (pref_list); int len = TREE_VEC_LENGTH (fr_list); for (int i = 0; i < len; i++) @@ -15920,6 +15925,11 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain, if (TYPE_USER_ALIGN (TREE_TYPE (t))) TREE_TYPE (r) = build_aligned_type (TREE_TYPE (r), TYPE_ALIGN (TREE_TYPE (t))); + + /* Preserve structural-ness of a partially instantiated typedef. */ + if (TYPE_STRUCTURAL_EQUALITY_P (TREE_TYPE (t)) + && dependent_type_p (TREE_TYPE (r))) + SET_TYPE_STRUCTURAL_EQUALITY (TREE_TYPE (r)); } layout_decl (r, 0); |