aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2003-01-17 17:51:24 -0500
committerJason Merrill <jason@gcc.gnu.org>2003-01-17 17:51:24 -0500
commit77b996cc58685d44753ff78a3e9f19b10c5be767 (patch)
tree2feeceef56d712b8613b9f24974f8d0c278bbe3a /gcc
parent5dae1114bb636a814b154c3c47ff6ad149bc81de (diff)
downloadgcc-77b996cc58685d44753ff78a3e9f19b10c5be767.zip
gcc-77b996cc58685d44753ff78a3e9f19b10c5be767.tar.gz
gcc-77b996cc58685d44753ff78a3e9f19b10c5be767.tar.bz2
re PR c++/9342 (another ICE in cp_expr_size at cp/cp-lang.c: 304)
PR c++/9342 * call.c (build_conditional_expr): Always do lvalue-rvalue conversion. From-SVN: r61457
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/call.c4
-rw-r--r--gcc/testsuite/g++.dg/init/copy4.C19
3 files changed, 27 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 36890c3..7a148f5 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2003-01-17 Jason Merrill <jason@redhat.com>
+
+ PR c++/9342
+ * call.c (build_conditional_expr): Always do lvalue-rvalue
+ conversion.
+
2003-01-17 Mark Mitchell <mark@codesourcery.com>
PR c++/9294
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index 5340356..cb0d351 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -3187,14 +3187,14 @@ build_conditional_expr (tree arg1, tree arg2, tree arg3)
We use ocp_convert rather than build_user_type_conversion because the
latter returns NULL_TREE on failure, while the former gives an error. */
- if (IS_AGGR_TYPE (TREE_TYPE (arg2)) && real_lvalue_p (arg2))
+ if (IS_AGGR_TYPE (TREE_TYPE (arg2)))
arg2 = ocp_convert (TREE_TYPE (arg2), arg2,
CONV_IMPLICIT|CONV_FORCE_TEMP, LOOKUP_NORMAL);
else
arg2 = decay_conversion (arg2);
arg2_type = TREE_TYPE (arg2);
- if (IS_AGGR_TYPE (TREE_TYPE (arg3)) && real_lvalue_p (arg3))
+ if (IS_AGGR_TYPE (TREE_TYPE (arg3)))
arg3 = ocp_convert (TREE_TYPE (arg3), arg3,
CONV_IMPLICIT|CONV_FORCE_TEMP, LOOKUP_NORMAL);
else
diff --git a/gcc/testsuite/g++.dg/init/copy4.C b/gcc/testsuite/g++.dg/init/copy4.C
new file mode 100644
index 0000000..bfff685
--- /dev/null
+++ b/gcc/testsuite/g++.dg/init/copy4.C
@@ -0,0 +1,19 @@
+// PR c++/9342
+// We were failing to wrap def().user in a TARGET_EXPR, so copying it
+// into the reference temp used a bitwise copy.
+
+struct QString
+{
+ QString( const QString & );
+ QString &operator=( const QString & );
+};
+struct ServerSettings
+{
+ QString user;
+};
+extern ServerSettings def();
+extern void arg( const QString& a );
+void startSession( bool b, QString s )
+{
+ arg (b ? def().user : s);
+}