Commit 1cb2b9a1 by Dodji Seketeli Committed by Dodji Seketeli

PR c++/53540 - using fails to be equivalent to typedef

In the example of this problem report, during the substituting of int
into 'function', tsubst_aggr_type fails for the alias ctxt1.  This is
because TYPE_TEMPLATE_INFO looks for the TEMPLATE_INFO of the ctxt1
alias at the wrong place and was wrongly finding it to be NULL.
Namely, it was looking for it in the DECL_TEMPLATE_INFO of the
declaration of the type -- as if ctxt1 was an alias template
specialization -- rather than looking for it in its
CLASSTYPE_TEMPLATE_INFO.

Fixed thus.  The other hunks of the patch are a cleanup to make a
better use of alias_template_specialization_p.

Bootstrapped and tested on x86_64-unknown-linux-gnu against trunk.

gcc/cp

	* cp-tree.h (TYPE_TEMPLATE_INFO): For an alias that is not an
	instance of alias template, don't look for its TEMPLATE_INFO in
	its declaration.
	(alias_template_specialization_p): Take const_tree.
	* pt.c (alias_template_specialization_p): Take a const_tree.
	Don't call primary_template_instantiation_p.
	(primary_template_instantiation_p): Call
	alias_template_specialization_p.

gcc/testsuite/

	* g++.dg/cpp0x/alias-decl-24.C: New test.

From-SVN: r192304
parent a5fdcc3b
2012-10-09 Dodji Seketeli <dodji@redhat.com>
PR c++/53540 - using fails to be equivalent to typedef
* cp-tree.h (TYPE_TEMPLATE_INFO): For an alias that is not an
instance of alias template, don't look for its TEMPLATE_INFO in
its declaration.
(alias_template_specialization_p): Take const_tree.
* pt.c (alias_template_specialization_p): Take a const_tree.
Don't call primary_template_instantiation_p.
(primary_template_instantiation_p): Call
alias_template_specialization_p.
2012-10-10 Dodji Seketeli <dodji@redhat.com> 2012-10-10 Dodji Seketeli <dodji@redhat.com>
* parser (cp_parser_statement): Parse c++11 attributes * parser (cp_parser_statement): Parse c++11 attributes
......
...@@ -2646,8 +2646,8 @@ extern void decl_shadowed_for_var_insert (tree, tree); ...@@ -2646,8 +2646,8 @@ extern void decl_shadowed_for_var_insert (tree, tree);
template info for the alias template, not the one (if any) for the template info for the alias template, not the one (if any) for the
template of the underlying type. */ template of the underlying type. */
#define TYPE_TEMPLATE_INFO(NODE) \ #define TYPE_TEMPLATE_INFO(NODE) \
(TYPE_ALIAS_P (NODE) \ ((TYPE_ALIAS_P (NODE) && DECL_LANG_SPECIFIC (TYPE_NAME (NODE))) \
? ((TYPE_NAME (NODE) && DECL_LANG_SPECIFIC (TYPE_NAME (NODE))) \ ? (DECL_LANG_SPECIFIC (TYPE_NAME (NODE)) \
? DECL_TEMPLATE_INFO (TYPE_NAME (NODE)) \ ? DECL_TEMPLATE_INFO (TYPE_NAME (NODE)) \
: NULL_TREE) \ : NULL_TREE) \
: ((TREE_CODE (NODE) == ENUMERAL_TYPE) \ : ((TREE_CODE (NODE) == ENUMERAL_TYPE) \
...@@ -5437,7 +5437,7 @@ extern bool reregister_specialization (tree, tree, tree); ...@@ -5437,7 +5437,7 @@ extern bool reregister_specialization (tree, tree, tree);
extern tree fold_non_dependent_expr (tree); extern tree fold_non_dependent_expr (tree);
extern tree fold_non_dependent_expr_sfinae (tree, tsubst_flags_t); extern tree fold_non_dependent_expr_sfinae (tree, tsubst_flags_t);
extern bool alias_type_or_template_p (tree); extern bool alias_type_or_template_p (tree);
extern bool alias_template_specialization_p (tree); extern bool alias_template_specialization_p (const_tree);
extern bool explicit_class_specialization_p (tree); extern bool explicit_class_specialization_p (tree);
extern int push_tinst_level (tree); extern int push_tinst_level (tree);
extern void pop_tinst_level (void); extern void pop_tinst_level (void);
......
...@@ -2929,10 +2929,7 @@ primary_template_instantiation_p (const_tree t) ...@@ -2929,10 +2929,7 @@ primary_template_instantiation_p (const_tree t)
else if (CLASS_TYPE_P (t) && !TYPE_DECL_ALIAS_P (TYPE_NAME (t))) else if (CLASS_TYPE_P (t) && !TYPE_DECL_ALIAS_P (TYPE_NAME (t)))
return CLASSTYPE_TEMPLATE_INSTANTIATION (t) return CLASSTYPE_TEMPLATE_INSTANTIATION (t)
&& PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (t)); && PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (t));
else if (TYPE_P (t) else if (alias_template_specialization_p (t))
&& TYPE_TEMPLATE_INFO (t)
&& PRIMARY_TEMPLATE_P (TYPE_TI_TEMPLATE (t))
&& DECL_TEMPLATE_INSTANTIATION (TYPE_NAME (t)))
return true; return true;
return false; return false;
} }
...@@ -5077,11 +5074,14 @@ alias_type_or_template_p (tree t) ...@@ -5077,11 +5074,14 @@ alias_type_or_template_p (tree t)
/* Return TRUE iff is a specialization of an alias template. */ /* Return TRUE iff is a specialization of an alias template. */
bool bool
alias_template_specialization_p (tree t) alias_template_specialization_p (const_tree t)
{ {
if (t == NULL_TREE) if (t == NULL_TREE)
return false; return false;
return (primary_template_instantiation_p (t)
return (TYPE_P (t)
&& TYPE_TEMPLATE_INFO (t)
&& PRIMARY_TEMPLATE_P (TYPE_TI_TEMPLATE (t))
&& DECL_ALIAS_TEMPLATE_P (TYPE_TI_TEMPLATE (t))); && DECL_ALIAS_TEMPLATE_P (TYPE_TI_TEMPLATE (t)));
} }
...@@ -10945,10 +10945,7 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl) ...@@ -10945,10 +10945,7 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl)
{ {
tree decl = TYPE_NAME (t); tree decl = TYPE_NAME (t);
if (TYPE_DECL_ALIAS_P (decl) if (alias_template_specialization_p (t))
&& DECL_LANG_SPECIFIC (decl)
&& DECL_TEMPLATE_INFO (decl)
&& PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (decl)))
{ {
/* DECL represents an alias template and we want to /* DECL represents an alias template and we want to
instantiate it. */ instantiate it. */
......
2012-10-09 Dodji Seketeli <dodji@redhat.com>
PR c++/53540 - using fails to be equivalent to typedef
* g++.dg/cpp0x/alias-decl-24.C: New test.
2012-10-10 Dodji Seketeli <dodji@redhat.com> 2012-10-10 Dodji Seketeli <dodji@redhat.com>
* g++.dg/cpp0x/gen-attrs-8.C: Update the test to reflect the fact * g++.dg/cpp0x/gen-attrs-8.C: Update the test to reflect the fact
......
// Origin: PR c++/53540
// { dg-do compile { target c++11 } }
template <typename T>
struct context
{
typedef int type;
};
template <typename T>
void function()
{
using ctx1 = context<T>;
typename ctx1::type f1;
typedef context<T> ctx2;
typename ctx2::type f2;
}
int main()
{
function<int>();
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment