diff options
author | Jason Merrill <jason@redhat.com> | 2009-02-13 14:14:07 -0500 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2009-02-13 14:14:07 -0500 |
commit | da964feac45702899e5e8cfffb0d78bdb5759b80 (patch) | |
tree | 1f92e7ac9446a8e08a82c60275545cd2748fd81d | |
parent | c2e7ba7e3a035ea6b6609a09d3a5b7061563c2ae (diff) | |
download | gcc-da964feac45702899e5e8cfffb0d78bdb5759b80.zip gcc-da964feac45702899e5e8cfffb0d78bdb5759b80.tar.gz gcc-da964feac45702899e5e8cfffb0d78bdb5759b80.tar.bz2 |
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
-rw-r--r-- | gcc/cp/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/cp/cp-tree.h | 2 | ||||
-rw-r--r-- | gcc/cp/pt.c | 4 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 10 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/decltype16.C | 10 |
6 files changed, 33 insertions, 6 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 7ead4b2..d9d6866 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +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> PR c++/38950 diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 5a9b891..b23a396 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 db8886c..81eaffe 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 55b0bae..dfff09b 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 7908894..d3f7ed7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +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> 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 0000000..2002458 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype16.C @@ -0,0 +1,10 @@ +// 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]; |