From: Paolo Carlini Date: Wed, 27 Nov 2013 15:55:18 +0000 (+0000) Subject: re PR c++/58647 (ICE with function pointer) X-Git-Tag: releases/gcc-4.9.0~2415 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=6f831b6df7a8cff16e7127beeb89ba6e32688196;p=thirdparty%2Fgcc.git re PR c++/58647 (ICE with function pointer) /cp 2013-11-27 Paolo Carlini PR c++/58647 * semantics.c (cxx_eval_constant_expression, [COMPONENT_REF]): Handle function COMPONENT_REFs. /testsuite 2013-11-27 Paolo Carlini PR c++/58647 * g++.dg/parse/crash66.C: New. From-SVN: r205449 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index c45ddbec7bd2..cbae6c43978f 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2013-11-27 Paolo Carlini + + PR c++/58647 + * semantics.c (cxx_eval_constant_expression, [COMPONENT_REF]): + Handle function COMPONENT_REFs. + 2013-11-27 Aldy Hernandez Jakub Jelinek diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index e72a9c2f1691..bc10f1de39bb 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -9603,6 +9603,16 @@ cxx_eval_constant_expression (const constexpr_call *call, tree t, break; case COMPONENT_REF: + if (is_overloaded_fn (t)) + { + /* We can only get here in checking mode via + build_non_dependent_expr, because any expression that + calls or takes the address of the function will have + pulled a FUNCTION_DECL out of the COMPONENT_REF. */ + gcc_checking_assert (allow_non_constant); + *non_constant_p = true; + return t; + } r = cxx_eval_component_reference (call, t, allow_non_constant, addr, non_constant_p, overflow_p); break; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 075e0b14d80f..cc389d4dc392 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-11-27 Paolo Carlini + + PR c++/58647 + * g++.dg/parse/crash66.C: New. + 2013-11-27 Kenneth Zadeck * gcc.dg/c90-const-expr-8.c: Look for overflow on INT_MIN % -1. diff --git a/gcc/testsuite/g++.dg/parse/crash66.C b/gcc/testsuite/g++.dg/parse/crash66.C new file mode 100644 index 000000000000..ceedd2be243a --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash66.C @@ -0,0 +1,11 @@ +// PR c++/58647 + +struct A +{ + static void foo(); +}; + +template void bar() +{ + A().foo; +}