Commit da964fea by Jason Merrill Committed by Jason Merrill

re PR c++/39070 (ICE with typeof() (... and __decltype))

        PR c++/39070
        * semantics.c (finish_call_expr): Change koenig_p parm to int.
        If -1, don't set KOENIG_LOOKUP_P but do keep hidden candidates.
        * cp-tree.h: Adjust prototype.
        * pt.c (tsubst_copy_and_build) [CALL_EXPR]: Pass -1.

From-SVN: r144161
parent c2e7ba7e
2009-02-13 Jason Merrill <jason@redhat.com>
PR c++/39070
* semantics.c (finish_call_expr): Change koenig_p parm to int.
If -1, don't set KOENIG_LOOKUP_P but do keep hidden candidates.
* cp-tree.h: Adjust prototype.
* pt.c (tsubst_copy_and_build) [CALL_EXPR]: Pass -1.
2009-02-12 Jason Merrill <jason@redhat.com> 2009-02-12 Jason Merrill <jason@redhat.com>
PR c++/38950 PR c++/38950
......
...@@ -4757,7 +4757,7 @@ extern tree finish_stmt_expr_expr (tree, tree); ...@@ -4757,7 +4757,7 @@ extern tree finish_stmt_expr_expr (tree, tree);
extern tree finish_stmt_expr (tree, bool); extern tree finish_stmt_expr (tree, bool);
extern tree stmt_expr_value_expr (tree); extern tree stmt_expr_value_expr (tree);
extern tree perform_koenig_lookup (tree, tree); extern tree perform_koenig_lookup (tree, tree);
extern tree finish_call_expr (tree, tree, bool, bool, extern tree finish_call_expr (tree, tree, bool, int,
tsubst_flags_t); tsubst_flags_t);
extern tree finish_increment_expr (tree, enum tree_code); extern tree finish_increment_expr (tree, enum tree_code);
extern tree finish_this_expr (void); extern tree finish_this_expr (void);
......
...@@ -11404,12 +11404,12 @@ tsubst_copy_and_build (tree t, ...@@ -11404,12 +11404,12 @@ tsubst_copy_and_build (tree t,
/*fn_p=*/NULL, /*fn_p=*/NULL,
complain)); complain));
} }
/* Pass true for koenig_p so that build_new_function_call will /* Pass -1 for koenig_p so that build_new_function_call will
allow hidden friends found by arg-dependent lookup at template allow hidden friends found by arg-dependent lookup at template
parsing time. */ parsing time. */
return finish_call_expr (function, call_args, return finish_call_expr (function, call_args,
/*disallow_virtual=*/qualified_p, /*disallow_virtual=*/qualified_p,
/*koenig_p*/true, /*koenig_p*/-1,
complain); complain);
} }
......
...@@ -1839,10 +1839,14 @@ perform_koenig_lookup (tree fn, tree args) ...@@ -1839,10 +1839,14 @@ perform_koenig_lookup (tree fn, tree args)
qualified. For example a call to `X::f' never generates a virtual qualified. For example a call to `X::f' never generates a virtual
call.) call.)
KOENIG_P is 1 if we want to perform argument-dependent lookup,
-1 if we don't, but we want to accept functions found by previous
argument-dependent lookup, and 0 if we want nothing to do with it.
Returns code for the call. */ Returns code for the call. */
tree tree
finish_call_expr (tree fn, tree args, bool disallow_virtual, bool koenig_p, finish_call_expr (tree fn, tree args, bool disallow_virtual, int koenig_p,
tsubst_flags_t complain) tsubst_flags_t complain)
{ {
tree result; tree result;
...@@ -1865,7 +1869,7 @@ finish_call_expr (tree fn, tree args, bool disallow_virtual, bool koenig_p, ...@@ -1865,7 +1869,7 @@ finish_call_expr (tree fn, tree args, bool disallow_virtual, bool koenig_p,
|| any_type_dependent_arguments_p (args)) || any_type_dependent_arguments_p (args))
{ {
result = build_nt_call_list (fn, args); result = build_nt_call_list (fn, args);
KOENIG_LOOKUP_P (result) = koenig_p; KOENIG_LOOKUP_P (result) = koenig_p > 0;
if (cfun) if (cfun)
{ {
do do
...@@ -1955,7 +1959,7 @@ finish_call_expr (tree fn, tree args, bool disallow_virtual, bool koenig_p, ...@@ -1955,7 +1959,7 @@ finish_call_expr (tree fn, tree args, bool disallow_virtual, bool koenig_p,
if (!result) if (!result)
/* A call to a namespace-scope function. */ /* A call to a namespace-scope function. */
result = build_new_function_call (fn, args, koenig_p, complain); result = build_new_function_call (fn, args, koenig_p != 0, complain);
} }
else if (TREE_CODE (fn) == PSEUDO_DTOR_EXPR) else if (TREE_CODE (fn) == PSEUDO_DTOR_EXPR)
{ {
......
2009-02-13 Jason Merrill <jason@redhat.com>
PR c++/39070
* g++.dg/cpp0x/decltype16.C: New.
2009-02-13 H.J. Lu <hongjiu.lu@intel.com> 2009-02-13 H.J. Lu <hongjiu.lu@intel.com>
PR target/39152 PR target/39152
......
// PR c++/39070
// { dg-options "-std=c++0x" }
template<typename X> struct junk {
template<typename Z> static Z y();
template<typename Y> static int test(...);
template<typename Y> static char test(decltype(y<Y>())*);
static int const value=sizeof(test<X>(0));
};
typedef char type[junk<int>::value==sizeof(char) ? 1 : -1];
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