Commit 69deaf14 by Jakub Jelinek Committed by Jakub Jelinek

re PR c++/87398 (g++ ICE on valid code: tree check: expected record_type or…

re PR c++/87398 (g++ ICE on valid code: tree check: expected record_type or union_type or qual_union_type, have array_type in cxx_eval_constant_expression, at cp/constexpr.c:4820)

	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.

	* g++.dg/other/pr87398.C: New test.
	* g++.dg/cpp2a/constexpr-virtual10.C: New test.
	* g++.dg/cpp2a/constexpr-virtual11.C: New test.

From-SVN: r264580
parent e8753bb8
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> 2018-09-25 Martin Liska <mliska@suse.cz>
* name-lookup.c (namespace_scope_ht_size): Remove * name-lookup.c (namespace_scope_ht_size): Remove
......
...@@ -4812,7 +4812,8 @@ cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t, ...@@ -4812,7 +4812,8 @@ cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t,
return t; return t;
} }
obj = TREE_OPERAND (obj, 0); 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); obj = TREE_OPERAND (obj, 0);
tree objtype = TREE_TYPE (obj); tree objtype = TREE_TYPE (obj);
/* Find the function decl in the virtual functions list. TOKEN is /* 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> 2018-09-25 Martin Jambor <mjambor@suse.cz>
PR testsuite/87339 PR testsuite/87339
......
// 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);
// 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);
// 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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment