From 7447f1d7e21fbebd7ddaf9865bf05104592f3049 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Wed, 4 Apr 2018 12:42:39 -0400 Subject: [PATCH] PR c++/85141 - ICE with compound assignment and static member fn. * typeck.c (cp_build_modify_expr): Call decay_conversion for RHS of compound assignment. From-SVN: r259089 --- gcc/cp/ChangeLog | 4 ++++ gcc/cp/typeck.c | 2 +- gcc/testsuite/g++.dg/expr/assign2.C | 12 ++++++++++++ gcc/testsuite/g++.dg/parse/crash60.C | 2 +- 4 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/expr/assign2.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 61483a5fa79..8ab7cce4732 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2018-04-04 Jason Merrill + PR c++/85141 - ICE with compound assignment and static member fn. + * typeck.c (cp_build_modify_expr): Call decay_conversion for RHS of + compound assignment. + PR c++/85148 - ICE with 'this' in array NSDMI. * tree.c (replace_placeholders_r): Use handled_component_p. diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 2b7a771bbeb..e5ad54dbcd1 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -8083,7 +8083,7 @@ cp_build_modify_expr (location_t loc, tree lhs, enum tree_code modifycode, side effect associated with any single compound assignment operator. -- end note ] */ lhs = cp_stabilize_reference (lhs); - rhs = rvalue (rhs); + rhs = decay_conversion (rhs, complain); if (rhs == error_mark_node) return error_mark_node; rhs = stabilize_expr (rhs, &init); diff --git a/gcc/testsuite/g++.dg/expr/assign2.C b/gcc/testsuite/g++.dg/expr/assign2.C new file mode 100644 index 00000000000..759584af8d2 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/assign2.C @@ -0,0 +1,12 @@ +// PR c++/85141 +// { dg-options "-w -fpermissive" } + +struct A +{ + static int foo(); +}; + +void bar(int i) +{ + i += A().foo; +} diff --git a/gcc/testsuite/g++.dg/parse/crash60.C b/gcc/testsuite/g++.dg/parse/crash60.C index e515396771e..8e545a253c5 100644 --- a/gcc/testsuite/g++.dg/parse/crash60.C +++ b/gcc/testsuite/g++.dg/parse/crash60.C @@ -10,5 +10,5 @@ void foo() int result = 0; M m; - result += m.pop(); // { dg-error "invalid operands|in evaluation" } + result += m.pop(); // { dg-error "" } } -- 2.30.2