From: Jason Merrill Date: Fri, 13 Feb 2009 19:14:07 +0000 (-0500) Subject: re PR c++/39070 (ICE with typeof() (... and __decltype)) X-Git-Tag: releases/gcc-4.4.0~549 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=da964feac45702899e5e8cfffb0d78bdb5759b80;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 7ead4b21c828..d9d6866e3ad4 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2009-02-13 Jason Merrill + + 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 PR c++/38950 diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 5a9b891668fb..b23a3963d447 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -4757,7 +4757,7 @@ extern tree finish_stmt_expr_expr (tree, tree); extern tree finish_stmt_expr (tree, bool); extern tree stmt_expr_value_expr (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); extern tree finish_increment_expr (tree, enum tree_code); extern tree finish_this_expr (void); diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index db8886c0d6cc..81eaffef57a3 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -11404,12 +11404,12 @@ tsubst_copy_and_build (tree t, /*fn_p=*/NULL, 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 parsing time. */ return finish_call_expr (function, call_args, /*disallow_virtual=*/qualified_p, - /*koenig_p*/true, + /*koenig_p*/-1, complain); } diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 55b0bae6cbb3..dfff09bb0af9 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -1839,10 +1839,14 @@ perform_koenig_lookup (tree fn, tree args) qualified. For example a call to `X::f' never generates a virtual 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. */ 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) { tree result; @@ -1865,7 +1869,7 @@ finish_call_expr (tree fn, tree args, bool disallow_virtual, bool koenig_p, || any_type_dependent_arguments_p (args)) { result = build_nt_call_list (fn, args); - KOENIG_LOOKUP_P (result) = koenig_p; + KOENIG_LOOKUP_P (result) = koenig_p > 0; if (cfun) { do @@ -1955,7 +1959,7 @@ finish_call_expr (tree fn, tree args, bool disallow_virtual, bool koenig_p, if (!result) /* 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) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7908894a7f8c..d3f7ed7f8415 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-02-13 Jason Merrill + + PR c++/39070 + * g++.dg/cpp0x/decltype16.C: New. + 2009-02-13 H.J. Lu PR target/39152 diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype16.C b/gcc/testsuite/g++.dg/cpp0x/decltype16.C new file mode 100644 index 000000000000..2002458b8515 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype16.C @@ -0,0 +1,10 @@ +// PR c++/39070 +// { dg-options "-std=c++0x" } + +template struct junk { + template static Z y(); + template static int test(...); + template static char test(decltype(y())*); + static int const value=sizeof(test(0)); +}; +typedef char type[junk::value==sizeof(char) ? 1 : -1];