Commit 5a57f1b2 by Jason Merrill Committed by Jason Merrill

re PR c++/15875 (rejects pointer to member in template)

        PR c++/15875
        Revert:
        2004-06-01  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
        * init.c (build_offset_ref): Build SCOPE_REF with non-null
        TREE_TYPE for non-dependent names.
        * pt.c (type_dependent_expression_p): Handle SCOPE_REF with
        unknown_type_node as its TREE_TYPE.
        * cxx-pretty_print.c (pp_cxx_unqualified_id): Handle BASELINK.
        * error.c (dump_decl) <SCOPE_REF case>: Use pp_expression.
        (dump_expr) <SCOPE_REF case>: Likewise.

From-SVN: r82933
parent 078c8b08
2004-06-10 Jason Merrill <jason@redhat.com>
PR c++/15875
Revert:
2004-06-01 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
* init.c (build_offset_ref): Build SCOPE_REF with non-null
TREE_TYPE for non-dependent names.
* pt.c (type_dependent_expression_p): Handle SCOPE_REF with
unknown_type_node as its TREE_TYPE.
* cxx-pretty_print.c (pp_cxx_unqualified_id): Handle BASELINK.
* error.c (dump_decl) <SCOPE_REF case>: Use pp_expression.
(dump_expr) <SCOPE_REF case>: Likewise.
2004-06-10 Mark Mitchell <mark@codesourcery.com>
PR c++/15227
......
......@@ -180,10 +180,6 @@ pp_cxx_unqualified_id (cxx_pretty_printer *pp, tree t)
pp_cxx_template_id (pp, t);
break;
case BASELINK:
pp_cxx_unqualified_id (pp, BASELINK_FUNCTIONS (t));
break;
case RECORD_TYPE:
case UNION_TYPE:
case ENUMERAL_TYPE:
......
......@@ -771,7 +771,9 @@ dump_decl (tree t, int flags)
break;
case SCOPE_REF:
pp_expression (cxx_pp, t);
dump_decl (TREE_OPERAND (t, 0), flags & ~TFF_DECL_SPECIFIERS);
pp_colon_colon (cxx_pp);
dump_decl (TREE_OPERAND (t, 1), flags);
break;
case ARRAY_REF:
......@@ -1697,7 +1699,9 @@ dump_expr (tree t, int flags)
break;
case SCOPE_REF:
pp_expression (cxx_pp, t);
dump_type (TREE_OPERAND (t, 0), flags);
pp_colon_colon (cxx_pp);
dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
break;
case CAST_EXPR:
......
......@@ -1368,7 +1368,7 @@ build_offset_ref (tree type, tree name, bool address_p)
if (TREE_CODE (name) == TEMPLATE_DECL)
return name;
if (dependent_type_p (type) || type_dependent_expression_p (name))
if (processing_template_decl || uses_template_parms (type))
return build_min_nt (SCOPE_REF, type, name);
if (TREE_CODE (name) == TEMPLATE_ID_EXPR)
......@@ -1450,14 +1450,6 @@ build_offset_ref (tree type, tree name, bool address_p)
return error_mark_node;
}
if (processing_template_decl)
{
if (TREE_CODE (orig_name) == TEMPLATE_ID_EXPR)
return build_min (SCOPE_REF, TREE_TYPE (member), type, orig_name);
else
return build_min (SCOPE_REF, TREE_TYPE (member), type, name);
}
if (TREE_CODE (member) == TYPE_DECL)
{
TREE_USED (member) = 1;
......
......@@ -11913,6 +11913,22 @@ type_dependent_expression_p (tree expression)
return dependent_type_p (type);
}
if (TREE_CODE (expression) == SCOPE_REF
&& dependent_scope_ref_p (expression,
type_dependent_expression_p))
return true;
if (TREE_CODE (expression) == FUNCTION_DECL
&& DECL_LANG_SPECIFIC (expression)
&& DECL_TEMPLATE_INFO (expression)
&& (any_dependent_template_arguments_p
(INNERMOST_TEMPLATE_ARGS (DECL_TI_ARGS (expression)))))
return true;
if (TREE_CODE (expression) == TEMPLATE_DECL
&& !DECL_TEMPLATE_TEMPLATE_PARM_P (expression))
return false;
if (TREE_TYPE (expression) == unknown_type_node)
{
if (TREE_CODE (expression) == ADDR_EXPR)
......@@ -11926,9 +11942,7 @@ type_dependent_expression_p (tree expression)
if (TREE_CODE (expression) == IDENTIFIER_NODE)
return false;
}
if (TREE_CODE (expression) == SCOPE_REF)
return false;
if (TREE_CODE (expression) == BASELINK)
expression = BASELINK_FUNCTIONS (expression);
if (TREE_CODE (expression) == TEMPLATE_ID_EXPR)
......@@ -11951,22 +11965,6 @@ type_dependent_expression_p (tree expression)
abort ();
}
if (TREE_CODE (expression) == SCOPE_REF
&& dependent_scope_ref_p (expression,
type_dependent_expression_p))
return true;
if (TREE_CODE (expression) == FUNCTION_DECL
&& DECL_LANG_SPECIFIC (expression)
&& DECL_TEMPLATE_INFO (expression)
&& (any_dependent_template_arguments_p
(INNERMOST_TEMPLATE_ARGS (DECL_TI_ARGS (expression)))))
return true;
if (TREE_CODE (expression) == TEMPLATE_DECL
&& !DECL_TEMPLATE_TEMPLATE_PARM_P (expression))
return false;
return (dependent_type_p (TREE_TYPE (expression)));
}
......
// { dg-do compile }
// Origin: Giovanni Bajo <giovannibajo@libero.it>
// Two-phase name lookup for address of member:
// Detecting error during parsing
struct S
{
char i;
};
template<int S::*p>
struct X
{};
template <class T>
struct Foo
{
X<&S::i> x; // { dg-error "convert|no type" }
};
// { dg-do compile }
// Origin: Giovanni Bajo <giovannibajo@libero.it>
// Two-phase name lookup for address of member:
// Overloading function
struct S
{
int f();
int f(int);
};
template<int (S::*p)()>
struct X
{};
template <class T>
struct Foo
{
X<&S::f> x;
};
// { dg-do compile }
// Origin: Giovanni Bajo <giovannibajo@libero.it>
// Two-phase name lookup for address of member:
// Detecting overloading function error during parsing
struct S
{
int f(char);
int f(int);
};
template<int (S::*p)()>
struct X
{};
template <class T>
struct Foo
{
X<&S::f> x; // { dg-error "convert|no type" }
};
// { dg-do compile }
// Origin: Giovanni Bajo <giovannibajo@libero.it>
// PR c++/13092: ICE taking address of member which is non-dependent
struct S
{
int i;
};
template<int S::*p>
struct X
{};
template <class T>
struct Foo
{
X<&S::i> x;
};
template struct Foo<void>;
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