diff options
author | Paolo Carlini <paolo.carlini@oracle.com> | 2014-07-17 16:22:19 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2014-07-17 16:22:19 +0000 |
commit | 835dee55a19b764fe246e5c86264af66b73bd313 (patch) | |
tree | 7820b3ddb8ebdec0d390d01041a54e5fc591cb59 | |
parent | 37738b0fe4b2f3be6f21fc20722e917185949764 (diff) | |
download | gcc-835dee55a19b764fe246e5c86264af66b73bd313.zip gcc-835dee55a19b764fe246e5c86264af66b73bd313.tar.gz gcc-835dee55a19b764fe246e5c86264af66b73bd313.tar.bz2 |
re PR c++/50961 (Fails to decay template function properly(?))
/cp
2014-07-17 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/50961
* call.c (standard_conversion): Use resolve_nondeduced_context
for type_unknown_p (EXPR) && TREE_CODE (TO) == BOOLEAN_TYPE.
/testsuite
2014-07-17 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/50961
* g++.dg/template/operator13.C: New.
From-SVN: r212760
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/call.c | 22 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/operator13.C | 12 |
4 files changed, 38 insertions, 7 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e4b27f4..779e087 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,11 @@ 2014-07-17 Paolo Carlini <paolo.carlini@oracle.com> + PR c++/50961 + * call.c (standard_conversion): Use resolve_nondeduced_context + for type_unknown_p (EXPR) && TREE_CODE (TO) == BOOLEAN_TYPE. + +2014-07-17 Paolo Carlini <paolo.carlini@oracle.com> + PR c++/61804 * parser.c (cp_parser_tokens_start_cast_expression): Return -1 for '++' and '--'. diff --git a/gcc/cp/call.c b/gcc/cp/call.c index ea8cb5f..61e2769 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -1107,14 +1107,22 @@ standard_conversion (tree to, tree from, tree expr, bool c_cast_p, to = strip_top_quals (to); from = strip_top_quals (from); - if ((TYPE_PTRFN_P (to) || TYPE_PTRMEMFUNC_P (to)) - && expr && type_unknown_p (expr)) + if (expr && type_unknown_p (expr)) { - tsubst_flags_t tflags = tf_conv; - expr = instantiate_type (to, expr, tflags); - if (expr == error_mark_node) - return NULL; - from = TREE_TYPE (expr); + if (TYPE_PTRFN_P (to) || TYPE_PTRMEMFUNC_P (to)) + { + tsubst_flags_t tflags = tf_conv; + expr = instantiate_type (to, expr, tflags); + if (expr == error_mark_node) + return NULL; + from = TREE_TYPE (expr); + } + else if (TREE_CODE (to) == BOOLEAN_TYPE) + { + /* Necessary for eg, TEMPLATE_ID_EXPRs (c++/50961). */ + expr = resolve_nondeduced_context (expr); + from = TREE_TYPE (expr); + } } fcode = TREE_CODE (from); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2e93ada..55cf9e5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-07-17 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/50961 + * g++.dg/template/operator13.C: New. + 2014-07-17 Kyrylo Tkachov <kyrylo.tkachov@arm.com> * gcc.target/aarch64/simd/vfma_f64.c: New test. diff --git a/gcc/testsuite/g++.dg/template/operator13.C b/gcc/testsuite/g++.dg/template/operator13.C new file mode 100644 index 0000000..1967c91 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/operator13.C @@ -0,0 +1,12 @@ +// PR c++/50961 + +template < class > void foo (); + +bool b1 = !foo<void>; +bool b2 = foo<void> ? true : false; + +void bar() +{ + if (foo<void>) + ; +} |