+2018-09-25 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/87398
+ * constexpr.c (cxx_eval_constant_expression) <case OBJ_TYPE_REF>: Only
+ look through COMPONENT_REFs with DECL_FIELD_IS_BASE FIELD_DECLs.
+
2018-09-25 Martin Liska <mliska@suse.cz>
* name-lookup.c (namespace_scope_ht_size): Remove
return t;
}
obj = TREE_OPERAND (obj, 0);
- while (handled_component_p (obj))
+ while (TREE_CODE (obj) == COMPONENT_REF
+ && DECL_FIELD_IS_BASE (TREE_OPERAND (obj, 1)))
obj = TREE_OPERAND (obj, 0);
tree objtype = TREE_TYPE (obj);
/* Find the function decl in the virtual functions list. TOKEN is
+2018-09-25 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/87398
+ * g++.dg/other/pr87398.C: New test.
+ * g++.dg/cpp2a/constexpr-virtual10.C: New test.
+ * g++.dg/cpp2a/constexpr-virtual11.C: New test.
+
2018-09-25 Martin Jambor <mjambor@suse.cz>
PR testsuite/87339
--- /dev/null
+// P1064R0
+// { dg-do compile }
+// { dg-options "-std=c++2a" }
+
+struct X
+{
+ constexpr virtual int f() const { return 1; };
+};
+
+struct Y : public X
+{
+ constexpr virtual int f() const { return 2; };
+};
+
+constexpr X a[2][1][3];
+constexpr Y b[3][12];
+static_assert (a[1][0][1].f() == 1);
+static_assert (b[2][11].f() == 2);
--- /dev/null
+// P1064R0
+// { dg-do compile }
+// { dg-options "-std=c++2a" }
+
+struct A
+{
+ constexpr virtual int f () const { return 1; }
+};
+
+struct B : public A
+{
+ constexpr virtual int f () const { return 2; }
+};
+
+struct C
+{
+ A a;
+ B b;
+};
+
+constexpr C c;
+constexpr const A &d = c.a;
+constexpr const A &e = c.b;
+constexpr const B &f = c.b;
+static_assert (c.a.f () == 1 && c.b.f () == 2);
+static_assert (d.f () == 1 && e.f () == 2 && f.f () == 2);
--- /dev/null
+// PR c++/87398
+// { dg-do compile }
+
+struct A { virtual int foo (); };
+
+int
+bar (int x)
+{
+ A e[5][2];
+ int f = e[4][x].foo ();
+ return f;
+}