PR c++/88120 - ICE when calling save_expr in a template.

* typeck.c (cp_build_binary_op): Call cp_save_expr instead of
	save_expr.

	* g++.dg/cpp0x/pr88120.C: New test.

From-SVN: r266492
This commit is contained in:
Marek Polacek 2018-11-26 23:26:40 +00:00 committed by Marek Polacek
parent 80de5ef9c1
commit 2426ee774b
4 changed files with 35 additions and 1 deletions

View file

@ -1,3 +1,9 @@
2018-11-26 Marek Polacek <polacek@redhat.com>
PR c++/88120 - ICE when calling save_expr in a template.
* typeck.c (cp_build_binary_op): Call cp_save_expr instead of
save_expr.
2018-11-22 Jakub Jelinek <jakub@redhat.com>
PR c++/87386

View file

@ -4919,7 +4919,7 @@ cp_build_binary_op (location_t location,
tree pfn0, delta0, e1, e2;
if (TREE_SIDE_EFFECTS (op0))
op0 = save_expr (op0);
op0 = cp_save_expr (op0);
pfn0 = pfn_from_ptrmemfunc (op0);
delta0 = delta_from_ptrmemfunc (op0);

View file

@ -1,3 +1,8 @@
2018-11-26 Marek Polacek <polacek@redhat.com>
PR c++/88120 - ICE when calling save_expr in a template.
* g++.dg/cpp0x/pr88120.C: New test.
2018-11-26 Jozef Lawrynowicz <jozef.l@mittosystems.com>
* c-c++-common/Warray-bounds-3.c (test_strcpy_bounds): Use long instead

View file

@ -0,0 +1,23 @@
// PR c++/88120
// { dg-do compile { target c++11 } }
typedef int a;
enum b : a;
class c {
enum f { d };
c(f);
friend c operator&(c, c);
typedef void (c::*e)();
operator e();
};
class g {
template <typename, typename> b h();
struct k {
c i;
};
};
template <typename, typename> b g::h() {
k j;
&j || j.i &c::d;
return b();
}