A non-type-dependent COND_EXPR within a template is reconstructed with the original operands, after one with non-dependent proxies is built to determine its result type. This is problematic because the operands of a COND_EXPR determined to be an rvalue may have been converted to denote their rvalue nature. The reconstructed one, however, won't have such conversions, so lvalue_kind may not recognize it as an rvalue, which may lead to e.g. incorrect overload resolution decisions. If we mistake such a COND_EXPR for an lvalue, overload resolution might regard a conversion sequence that binds it to a non-const reference as viable, and then select that over one that binds it to a const reference. Only after template substitution would we rebuild the COND_EXPR, realize it is an rvalue, and conclude the reference binding is ill-formed, but at that point we'd have long discarded any alternate candidates we could have used. This patch modifies the logic that determines whether a (non-type-dependent) COND_EXPR in a template is an lvalue, to rely on its type, more specifically, on the presence of a REFERENCE_TYPE wrapper. In order to avoid a type bootstrapping problem, the REFERENCE_TYPE that wraps the type of some such COND_EXPRs is introduced earlier, so that we don't have to test for lvalueness of the expression using the very code that we wish to change. for gcc/cp/ChangeLog PR c++/84231 * tree.c (lvalue_kind): Use presence/absence of REFERENCE_TYPE only while processing template decls. * typeck.c (build_x_conditional_expr): Move wrapping of reference type around type... * call.c (build_conditional_expr_1): ... here. Rename is_lvalue to is_glvalue. * parser.c (cp_parser_fold_expression): Catch REFERENCE_REF_P INDIRECT_REF of COND_EXPR too. for gcc/testsuite/ChangeLog PR c++/84231 * g++.dg/pr84231.C: New. From-SVN: r258271
| Name |
Last commit
|
Last update |
|---|---|---|
| .. | ||
| ChangeLog | Loading commit data... | |
| ChangeLog-1993 | Loading commit data... | |
| ChangeLog-1994 | Loading commit data... | |
| ChangeLog-1995 | Loading commit data... | |
| ChangeLog-1996 | Loading commit data... | |
| ChangeLog-1997 | Loading commit data... | |
| ChangeLog-1998 | Loading commit data... | |
| ChangeLog-1999 | Loading commit data... | |
| ChangeLog-2000 | Loading commit data... | |
| ChangeLog-2001 | Loading commit data... | |
| ChangeLog-2002 | Loading commit data... | |
| ChangeLog-2003 | Loading commit data... | |
| ChangeLog-2004 | Loading commit data... | |
| ChangeLog-2005 | Loading commit data... | |
| ChangeLog-2006 | Loading commit data... | |
| ChangeLog-2007 | Loading commit data... | |
| ChangeLog-2008 | Loading commit data... | |
| ChangeLog-2009 | Loading commit data... | |
| ChangeLog-2010 | Loading commit data... | |
| ChangeLog-2011 | Loading commit data... | |
| ChangeLog-2012 | Loading commit data... | |
| ChangeLog-2013 | Loading commit data... | |
| ChangeLog-2014 | Loading commit data... | |
| ChangeLog-2015 | Loading commit data... | |
| ChangeLog-2016 | Loading commit data... | |
| ChangeLog-2017 | Loading commit data... | |
| ChangeLog.ptr | Loading commit data... | |
| ChangeLog.tree-ssa | Loading commit data... | |
| Make-lang.in | Loading commit data... | |
| NEWS | Loading commit data... | |
| call.c | Loading commit data... | |
| cfns.gperf | Loading commit data... | |
| cfns.h | Loading commit data... | |
| class.c | Loading commit data... | |
| config-lang.in | Loading commit data... | |
| constexpr.c | Loading commit data... | |
| constraint.cc | Loading commit data... | |
| cp-gimplify.c | Loading commit data... | |
| cp-lang.c | Loading commit data... | |
| cp-objcp-common.c | Loading commit data... | |
| cp-objcp-common.h | Loading commit data... | |
| cp-tree.def | Loading commit data... | |
| cp-tree.h | Loading commit data... | |
| cp-ubsan.c | Loading commit data... | |
| cvt.c | Loading commit data... | |
| cxx-pretty-print.c | Loading commit data... | |
| cxx-pretty-print.h | Loading commit data... | |
| decl.c | Loading commit data... | |
| decl.h | Loading commit data... | |
| decl2.c | Loading commit data... | |
| dump.c | Loading commit data... | |
| error.c | Loading commit data... | |
| except.c | Loading commit data... | |
| expr.c | Loading commit data... | |
| friend.c | Loading commit data... | |
| g++spec.c | Loading commit data... | |
| init.c | Loading commit data... | |
| lambda.c | Loading commit data... | |
| lang-specs.h | Loading commit data... | |
| lex.c | Loading commit data... | |
| logic.cc | Loading commit data... | |
| mangle.c | Loading commit data... | |
| method.c | Loading commit data... | |
| name-lookup.c | Loading commit data... | |
| name-lookup.h | Loading commit data... | |
| operators.def | Loading commit data... | |
| optimize.c | Loading commit data... | |
| parser.c | Loading commit data... | |
| parser.h | Loading commit data... | |
| pt.c | Loading commit data... | |
| ptree.c | Loading commit data... | |
| repo.c | Loading commit data... | |
| rtti.c | Loading commit data... | |
| search.c | Loading commit data... | |
| semantics.c | Loading commit data... | |
| tree.c | Loading commit data... | |
| type-utils.h | Loading commit data... | |
| typeck.c | Loading commit data... | |
| typeck2.c | Loading commit data... | |
| vtable-class-hierarchy.c | Loading commit data... |