From 08de4af3ea2b4e489fa52c4ccd2c729fba38a231 Mon Sep 17 00:00:00 2001 From: paolo Date: Tue, 13 Feb 2018 21:23:22 +0000 Subject: /cp 2018-02-13 Paolo Carlini PR c++/84333 * call.c (build_conditional_expr_1): Use cp_save_expr instead of save_expr for the G++ extension. /testsuite 2018-02-13 Paolo Carlini PR c++/84333 * g++.dg/template/sizeof16.C: New. * g++.dg/template/sizeof17.C: Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@257638 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/call.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'gcc/cp/call.c') diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 15b723ad2b0..7176e4afa15 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -4805,7 +4805,7 @@ build_conditional_expr_1 (location_t loc, tree arg1, tree arg2, tree arg3, if (lvalue_p (arg1)) arg2 = arg1 = cp_stabilize_reference (arg1); else - arg2 = arg1 = save_expr (arg1); + arg2 = arg1 = cp_save_expr (arg1); } /* If something has already gone wrong, just pass that fact up the -- cgit v1.2.1 From 7238ae962fbc16a752efad42931d43cbe4764d75 Mon Sep 17 00:00:00 2001 From: jason Date: Fri, 16 Feb 2018 02:47:19 +0000 Subject: PR c++/83227 - C++17 ICE with init-list derived-to-base conversion. * call.c (convert_like_real): Don't use the copy-list-initialization shortcut for ck_base. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@257720 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/call.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'gcc/cp/call.c') diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 7176e4afa15..5698ff60a4d 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -6938,6 +6938,11 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum, && DECL_INHERITED_CTOR (current_function_decl)) return expr; + if (TREE_CODE (expr) == TARGET_EXPR + && TARGET_EXPR_LIST_INIT_P (expr)) + /* Copy-list-initialization doesn't actually involve a copy. */ + return expr; + /* Fall through. */ case ck_base: if (convs->kind == ck_base && !convs->need_temporary_p) @@ -6964,10 +6969,6 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum, if (convs->rvaluedness_matches_p) /* standard_conversion got LOOKUP_PREFER_RVALUE. */ flags |= LOOKUP_PREFER_RVALUE; - if (TREE_CODE (expr) == TARGET_EXPR - && TARGET_EXPR_LIST_INIT_P (expr)) - /* Copy-list-initialization doesn't actually involve a copy. */ - return expr; expr = build_temp (expr, totype, flags, &diag_kind, complain); if (diag_kind && complain) { -- cgit v1.2.1 From 525ca7cc0a25ba914c7643bd111f3f5cf5a6abf4 Mon Sep 17 00:00:00 2001 From: jason Date: Fri, 16 Feb 2018 20:05:28 +0000 Subject: PR c++/83835 - C++17 error with constructor ctors. * call.c (build_special_member_call): Set TARGET_EXPR_DIRECT_INIT_P. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@257757 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/call.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'gcc/cp/call.c') diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 5698ff60a4d..d3d0966f65c 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -8834,6 +8834,9 @@ build_special_member_call (tree instance, tree name, vec **args, { if (is_dummy_object (instance)) return arg; + else if (TREE_CODE (arg) == TARGET_EXPR) + TARGET_EXPR_DIRECT_INIT_P (arg) = true; + if ((complain & tf_error) && (flags & LOOKUP_DELEGATING_CONS)) check_self_delegation (arg); -- cgit v1.2.1 From 63cb1fa29c1cbdc304cd034b78d6ac5137c1c8d4 Mon Sep 17 00:00:00 2001 From: jason Date: Fri, 16 Feb 2018 21:03:02 +0000 Subject: PR c++/84151 - unnecessary volatile load with static member. * call.c (build_new_method_call_1): Avoid loading from a volatile lvalue used as the object argument for a static member function. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@257763 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/call.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'gcc/cp/call.c') diff --git a/gcc/cp/call.c b/gcc/cp/call.c index d3d0966f65c..7c93c6d8290 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -9284,8 +9284,14 @@ build_new_method_call_1 (tree instance, tree fns, vec **args, if (TREE_CODE (TREE_TYPE (fn)) != METHOD_TYPE && !is_dummy_object (instance) && TREE_SIDE_EFFECTS (instance)) - call = build2 (COMPOUND_EXPR, TREE_TYPE (call), - instance, call); + { + /* But avoid the implicit lvalue-rvalue conversion when 'a' + is volatile. */ + tree a = instance; + if (TREE_THIS_VOLATILE (a)) + a = build_this (a); + call = build2 (COMPOUND_EXPR, TREE_TYPE (call), a, call); + } else if (call != error_mark_node && DECL_DESTRUCTOR_P (cand->fn) && !VOID_TYPE_P (TREE_TYPE (call))) -- cgit v1.2.1