diff options
Diffstat (limited to 'gcc/cp/pt.c')
-rw-r--r-- | gcc/cp/pt.c | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 9c82e3c19a5..0a194440ae6 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -3795,12 +3795,11 @@ process_partial_specialization (tree decl) || (!packed_args && i < nargs - 1)) { if (TREE_CODE (arg) == EXPR_PACK_EXPANSION) - error ("parameter pack argument %qE must be at the end of the template argument list", arg); + error ("parameter pack argument %qE must be at the " + "end of the template argument list", arg); else - error ("parameter pack argument %qT must be at the end of the template argument list", arg); - - if (packed_args) - TREE_VEC_ELT (packed_args, j) = error_mark_node; + error ("parameter pack argument %qT must be at the " + "end of the template argument list", arg); } } @@ -5370,6 +5369,22 @@ convert_template_argument (tree parm, if (TREE_CODE (arg) == TYPE_PACK_EXPANSION) arg = PACK_EXPANSION_PATTERN (arg); + /* Deal with an injected-class-name used as a template template arg. */ + if (requires_tmpl_type && CLASS_TYPE_P (arg)) + { + tree t = maybe_get_template_decl_from_type_decl (TYPE_NAME (arg)); + if (TREE_CODE (t) == TEMPLATE_DECL) + { + if (complain & tf_warning_or_error) + pedwarn (input_location, OPT_pedantic, "injected-class-name %qD" + " used as template template argument", TYPE_NAME (arg)); + else if (flag_pedantic_errors) + t = arg; + + arg = t; + } + } + is_tmpl_type = ((TREE_CODE (arg) == TEMPLATE_DECL && TREE_CODE (DECL_TEMPLATE_RESULT (arg)) == TYPE_DECL) |