Commit 7574c916 by Jason Merrill Committed by Jason Merrill

re PR c++/69995 ([C++14] Invalid result when evaluating constexpr function)

	PR c++/69995
	* constexpr.c (cxx_eval_store_expression): Unshare init.

From-SVN: r233810
parent cbd400b4
2016-02-28 Jason Merrill <jason@redhat.com>
PR c++/69995
* constexpr.c (cxx_eval_store_expression): Unshare init.
2016-02-26 Jason Merrill <jason@redhat.com> 2016-02-26 Jason Merrill <jason@redhat.com>
PR c++/69958 PR c++/69958
......
...@@ -2925,6 +2925,8 @@ cxx_eval_store_expression (const constexpr_ctx *ctx, tree t, ...@@ -2925,6 +2925,8 @@ cxx_eval_store_expression (const constexpr_ctx *ctx, tree t,
init = cxx_eval_constant_expression (&new_ctx, init, false, init = cxx_eval_constant_expression (&new_ctx, init, false,
non_constant_p, overflow_p); non_constant_p, overflow_p);
/* Don't share a CONSTRUCTOR that might be changed later. */
init = unshare_expr (init);
if (target == object) if (target == object)
{ {
/* The hash table might have moved since the get earlier. */ /* The hash table might have moved since the get earlier. */
......
// PR c++/69995
// { dg-do compile { target c++14 } }
#define assert(X) static_assert((X),#X)
#define CONSTEXPR constexpr
template <typename T, unsigned long Size>
struct array {
T elems_[Size];
constexpr T const& operator[](unsigned long n) const
{ return elems_[n]; }
constexpr T& operator[](unsigned long n)
{ return elems_[n]; }
};
template <typename T>
CONSTEXPR void my_swap(T& a, T& b) {
T tmp = a;
a = b;
b = tmp;
}
CONSTEXPR auto rotate2() {
array<array<int, 2>, 2> result{};
array<int, 2> a{{0, 1}};
result[0] = a;
my_swap(a[0], a[1]);
result[1] = a;
return result;
}
int main() {
CONSTEXPR auto indices = rotate2();
assert(indices[0][0] == 0);
assert(indices[0][1] == 1);
assert(indices[1][0] == 1);
assert(indices[1][1] == 0);
}
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