It's simple enough to make potential_constant_expression_1 handle MEM_REF.
Tested x86_64-pc-linux-gnu, applying to trunk.
commit c25738941b9d32a9653bca90a896407667685d91 Author: Jason Merrill <ja...@redhat.com> Date: Thu Mar 26 13:11:13 2015 -0400 PR c++/65525 * constexpr.c (potential_constant_expression_1): Handle MEM_REF. diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c index 37b619d..2f09472 100644 --- a/gcc/cp/constexpr.c +++ b/gcc/cp/constexpr.c @@ -4395,6 +4395,7 @@ potential_constant_expression_1 (tree t, bool want_rval, bool strict, case ARRAY_RANGE_REF: case MEMBER_REF: case DOTSTAR_EXPR: + case MEM_REF: binary: for (i = 0; i < 2; ++i) if (!RECUR (TREE_OPERAND (t, i), want_rval)) diff --git a/gcc/testsuite/g++.dg/parse/assign1.C b/gcc/testsuite/g++.dg/parse/assign1.C new file mode 100644 index 0000000..c0138c1 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/assign1.C @@ -0,0 +1,22 @@ +// PR c++/65525 + +struct A +{ + int x; + char y; // Actually, short and bool (types smaller than int?) trigger this ICE too + // Also: the problem doesn't occur if you put the smaller type first, e.g. "char x; int y;" + + A(int x) {} // custom ctor needed for ICE +}; + +int main() +{ + A a(0), x(1), y(2); + + x = a; // OK + y = a; // OK + x = y = a; // ICE: sorry, unimplemented: unexpected AST of kind mem_ref + // internal compiler error: in potential_constant_expression_1, at cp/constexpr.c:4432 + + return 0; +}