Commit c5ce25ce by Paolo Carlini Committed by Paolo Carlini

re PR c++/50870 ([C++0x] [4.6/4.7 Regression] ICE with decltype, operator->, and…

re PR c++/50870 ([C++0x] [4.6/4.7 Regression] ICE with decltype, operator->, and default template arguments)

2011-10-26  Paolo Carlini  <paolo.carlini@oracle.com>

	* typeck.c (cp_build_addr_expr_1): Use BASELINK_P.
	* class.c (instantiate_type): Likewise.
	* pt.c (convert_nontype_argument_function, uses_template_parms,
	tsubst_copy, resolve_nondeduced_context, type_dependent_expression_p):
	Likewise.
	* semantics.c (finish_decltype_type): Likewise.
	* decl2.c (mark_used): Likewise.
	* name-lookup.c (arg_assoc): Likewise.

/cp
2011-10-26  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/50870
	* typeck.c (non_reference): Pass NULL_TREE through.

/testsuite
2011-10-26  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/50870
	* g++.dg/cpp0x/decltype34.C: New.

From-SVN: r180531
parent e3c1bb61
2011-10-26 Paolo Carlini <paolo.carlini@oracle.com>
* typeck.c (cp_build_addr_expr_1): Use BASELINK_P.
* class.c (instantiate_type): Likewise.
* pt.c (convert_nontype_argument_function, uses_template_parms,
tsubst_copy, resolve_nondeduced_context, type_dependent_expression_p):
Likewise.
* semantics.c (finish_decltype_type): Likewise.
* decl2.c (mark_used): Likewise.
* name-lookup.c (arg_assoc): Likewise.
2011-10-26 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/50870
* typeck.c (non_reference): Pass NULL_TREE through.
2011-10-25 Jason Merrill <jason@redhat.com> 2011-10-25 Jason Merrill <jason@redhat.com>
PR c++/50866 PR c++/50866
......
...@@ -6873,7 +6873,7 @@ instantiate_type (tree lhstype, tree rhs, tsubst_flags_t flags) ...@@ -6873,7 +6873,7 @@ instantiate_type (tree lhstype, tree rhs, tsubst_flags_t flags)
} }
} }
if (TREE_CODE (rhs) == BASELINK) if (BASELINK_P (rhs))
{ {
access_path = BASELINK_ACCESS_BINFO (rhs); access_path = BASELINK_ACCESS_BINFO (rhs);
rhs = BASELINK_FUNCTIONS (rhs); rhs = BASELINK_FUNCTIONS (rhs);
......
...@@ -4174,7 +4174,7 @@ mark_used (tree decl) ...@@ -4174,7 +4174,7 @@ mark_used (tree decl)
like the DECL for the function. Otherwise, if the BASELINK is like the DECL for the function. Otherwise, if the BASELINK is
for an overloaded function, we don't know which function was for an overloaded function, we don't know which function was
actually used until after overload resolution. */ actually used until after overload resolution. */
if (TREE_CODE (decl) == BASELINK) if (BASELINK_P (decl))
{ {
decl = BASELINK_FUNCTIONS (decl); decl = BASELINK_FUNCTIONS (decl);
if (really_overloaded_fn (decl)) if (really_overloaded_fn (decl))
......
...@@ -5329,7 +5329,7 @@ arg_assoc (struct arg_lookup *k, tree n) ...@@ -5329,7 +5329,7 @@ arg_assoc (struct arg_lookup *k, tree n)
n = TREE_OPERAND (n, 1); n = TREE_OPERAND (n, 1);
while (TREE_CODE (n) == TREE_LIST) while (TREE_CODE (n) == TREE_LIST)
n = TREE_VALUE (n); n = TREE_VALUE (n);
if (TREE_CODE (n) == BASELINK) if (BASELINK_P (n))
n = BASELINK_FUNCTIONS (n); n = BASELINK_FUNCTIONS (n);
if (TREE_CODE (n) == FUNCTION_DECL) if (TREE_CODE (n) == FUNCTION_DECL)
......
...@@ -5277,7 +5277,7 @@ convert_nontype_argument_function (tree type, tree expr) ...@@ -5277,7 +5277,7 @@ convert_nontype_argument_function (tree type, tree expr)
fn_no_ptr = fn; fn_no_ptr = fn;
if (TREE_CODE (fn_no_ptr) == ADDR_EXPR) if (TREE_CODE (fn_no_ptr) == ADDR_EXPR)
fn_no_ptr = TREE_OPERAND (fn_no_ptr, 0); fn_no_ptr = TREE_OPERAND (fn_no_ptr, 0);
if (TREE_CODE (fn_no_ptr) == BASELINK) if (BASELINK_P (fn_no_ptr))
fn_no_ptr = BASELINK_FUNCTIONS (fn_no_ptr); fn_no_ptr = BASELINK_FUNCTIONS (fn_no_ptr);
/* [temp.arg.nontype]/1 /* [temp.arg.nontype]/1
...@@ -7801,7 +7801,7 @@ uses_template_parms (tree t) ...@@ -7801,7 +7801,7 @@ uses_template_parms (tree t)
|| EXPR_P (t) || EXPR_P (t)
|| TREE_CODE (t) == TEMPLATE_PARM_INDEX || TREE_CODE (t) == TEMPLATE_PARM_INDEX
|| TREE_CODE (t) == OVERLOAD || TREE_CODE (t) == OVERLOAD
|| TREE_CODE (t) == BASELINK || BASELINK_P (t)
|| TREE_CODE (t) == IDENTIFIER_NODE || TREE_CODE (t) == IDENTIFIER_NODE
|| TREE_CODE (t) == TRAIT_EXPR || TREE_CODE (t) == TRAIT_EXPR
|| TREE_CODE (t) == CONSTRUCTOR || TREE_CODE (t) == CONSTRUCTOR
...@@ -11993,7 +11993,7 @@ tsubst_copy (tree t, tree args, tsubst_flags_t complain, tree in_decl) ...@@ -11993,7 +11993,7 @@ tsubst_copy (tree t, tree args, tsubst_flags_t complain, tree in_decl)
base, name, base, name,
/*template_p=*/false); /*template_p=*/false);
} }
else if (TREE_CODE (name) == BASELINK) else if (BASELINK_P (name))
name = tsubst_baselink (name, name = tsubst_baselink (name,
non_reference (TREE_TYPE (object)), non_reference (TREE_TYPE (object)),
args, complain, args, complain,
...@@ -15197,7 +15197,7 @@ resolve_nondeduced_context (tree orig_expr) ...@@ -15197,7 +15197,7 @@ resolve_nondeduced_context (tree orig_expr)
offset = expr; offset = expr;
expr = TREE_OPERAND (expr, 1); expr = TREE_OPERAND (expr, 1);
} }
if (TREE_CODE (expr) == BASELINK) if (BASELINK_P (expr))
{ {
baselink = expr; baselink = expr;
expr = BASELINK_FUNCTIONS (expr); expr = BASELINK_FUNCTIONS (expr);
...@@ -19314,7 +19314,7 @@ type_dependent_expression_p (tree expression) ...@@ -19314,7 +19314,7 @@ type_dependent_expression_p (tree expression)
if (TREE_CODE (expression) == SCOPE_REF) if (TREE_CODE (expression) == SCOPE_REF)
return false; return false;
if (TREE_CODE (expression) == BASELINK) if (BASELINK_P (expression))
expression = BASELINK_FUNCTIONS (expression); expression = BASELINK_FUNCTIONS (expression);
if (TREE_CODE (expression) == TEMPLATE_ID_EXPR) if (TREE_CODE (expression) == TEMPLATE_ID_EXPR)
......
...@@ -5115,7 +5115,7 @@ finish_decltype_type (tree expr, bool id_expression_or_member_access_p, ...@@ -5115,7 +5115,7 @@ finish_decltype_type (tree expr, bool id_expression_or_member_access_p,
step. */ step. */
expr = TREE_OPERAND (expr, 1); expr = TREE_OPERAND (expr, 1);
if (TREE_CODE (expr) == BASELINK) if (BASELINK_P (expr))
/* See through BASELINK nodes to the underlying function. */ /* See through BASELINK nodes to the underlying function. */
expr = BASELINK_FUNCTIONS (expr); expr = BASELINK_FUNCTIONS (expr);
......
...@@ -4946,7 +4946,7 @@ cp_build_addr_expr_1 (tree arg, bool strict_lvalue, tsubst_flags_t complain) ...@@ -4946,7 +4946,7 @@ cp_build_addr_expr_1 (tree arg, bool strict_lvalue, tsubst_flags_t complain)
if (TREE_CODE (arg) == OFFSET_REF) if (TREE_CODE (arg) == OFFSET_REF)
PTRMEM_OK_P (val) = PTRMEM_OK_P (arg); PTRMEM_OK_P (val) = PTRMEM_OK_P (arg);
} }
else if (TREE_CODE (TREE_OPERAND (arg, 1)) == BASELINK) else if (BASELINK_P (TREE_OPERAND (arg, 1)))
{ {
tree fn = BASELINK_FUNCTIONS (TREE_OPERAND (arg, 1)); tree fn = BASELINK_FUNCTIONS (TREE_OPERAND (arg, 1));
...@@ -8322,7 +8322,7 @@ casts_away_constness (tree t1, tree t2) ...@@ -8322,7 +8322,7 @@ casts_away_constness (tree t1, tree t2)
tree tree
non_reference (tree t) non_reference (tree t)
{ {
if (TREE_CODE (t) == REFERENCE_TYPE) if (t && TREE_CODE (t) == REFERENCE_TYPE)
t = TREE_TYPE (t); t = TREE_TYPE (t);
return t; return t;
} }
......
2011-10-26 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/50870
* g++.dg/cpp0x/decltype34.C: New.
2011-10-26 Tom de Vries <tom@codesourcery.com> 2011-10-26 Tom de Vries <tom@codesourcery.com>
* gcc.c-torture/unsorted/HIcmp.c: Fix unaligned pointer. * gcc.c-torture/unsorted/HIcmp.c: Fix unaligned pointer.
......
// PR c++/50870
// { dg-options "-std=gnu++0x" }
struct impl
{
template <class T> static T create();
};
template<class T, class U,
class = decltype(impl::create<T>()->impl::create<U>())>
struct tester{};
tester<impl*, int> ti;
template<class T, class U,
class = decltype(impl::create<T>()->impl::create<U>())>
int test() { return 0; }
int i = test<impl*, 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