017-04-17 Bernd Edlinger <bernd.edlinger@hotmail.de>
PR c++/80287 * class.c (fixup_may_alias): Fix all type variants. gcc/testsuite 2017-04-17 Bernd Edlinger <bernd.edlinger@hotmail.de> PR c++/80287 * g++.dg/lto/pr80287_0.C: New test. From-SVN: r246955
This commit is contained in:
parent
d478f1e4c9
commit
1adb82e117
4 changed files with 107 additions and 3 deletions
|
@ -1,3 +1,8 @@
|
|||
2017-04-17 Bernd Edlinger <bernd.edlinger@hotmail.de>
|
||||
|
||||
PR c++/80287
|
||||
* class.c (fixup_may_alias): Fix all type variants.
|
||||
|
||||
2017-04-17 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/80415 - wrong error with default arg and array reference.
|
||||
|
|
|
@ -2060,12 +2060,14 @@ fixup_type_variants (tree t)
|
|||
static void
|
||||
fixup_may_alias (tree klass)
|
||||
{
|
||||
tree t;
|
||||
tree t, v;
|
||||
|
||||
for (t = TYPE_POINTER_TO (klass); t; t = TYPE_NEXT_PTR_TO (t))
|
||||
TYPE_REF_CAN_ALIAS_ALL (t) = true;
|
||||
for (v = TYPE_MAIN_VARIANT (t); v; v = TYPE_NEXT_VARIANT (v))
|
||||
TYPE_REF_CAN_ALIAS_ALL (v) = true;
|
||||
for (t = TYPE_REFERENCE_TO (klass); t; t = TYPE_NEXT_REF_TO (t))
|
||||
TYPE_REF_CAN_ALIAS_ALL (t) = true;
|
||||
for (v = TYPE_MAIN_VARIANT (t); v; v = TYPE_NEXT_VARIANT (v))
|
||||
TYPE_REF_CAN_ALIAS_ALL (v) = true;
|
||||
}
|
||||
|
||||
/* Early variant fixups: we apply attributes at the beginning of the class
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2017-04-17 Bernd Edlinger <bernd.edlinger@hotmail.de>
|
||||
|
||||
PR c++/80287
|
||||
* g++.dg/lto/pr80287_0.C: New test.
|
||||
|
||||
2017-04-12 Kelvin Nilsen <kelvin@gcc.gnu.org>
|
||||
|
||||
PR target/80315
|
||||
|
|
92
gcc/testsuite/g++.dg/lto/pr80287_0.C
Normal file
92
gcc/testsuite/g++.dg/lto/pr80287_0.C
Normal file
|
@ -0,0 +1,92 @@
|
|||
// { dg-lto-options { "-std=gnu++17" } }
|
||||
// { dg-lto-do run }
|
||||
|
||||
// Copyright (C) 2014-2017 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 3, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING3. If not see
|
||||
// <http://www.gnu.org/licenses/>.
|
||||
|
||||
#include <any>
|
||||
#define VERIFY(x) if (!(x)) __builtin_abort()
|
||||
|
||||
using std::any;
|
||||
using std::any_cast;
|
||||
|
||||
bool moved = false;
|
||||
bool copied = false;
|
||||
|
||||
struct X
|
||||
{
|
||||
X() = default;
|
||||
X(const X&) { copied = true; }
|
||||
X(X&& x) { moved = true; }
|
||||
};
|
||||
|
||||
struct X2
|
||||
{
|
||||
X2() = default;
|
||||
X2(const X2&) { copied = true; }
|
||||
X2(X2&& x) noexcept { moved = true; }
|
||||
}__attribute((may_alias));
|
||||
|
||||
void test01()
|
||||
{
|
||||
moved = false;
|
||||
X x;
|
||||
any a1;
|
||||
a1 = x;
|
||||
VERIFY(moved == false);
|
||||
any a2;
|
||||
copied = false;
|
||||
a2 = std::move(x);
|
||||
VERIFY(moved == true);
|
||||
VERIFY(copied == false);
|
||||
}
|
||||
|
||||
void test02()
|
||||
{
|
||||
moved = false;
|
||||
X x;
|
||||
any a1;
|
||||
a1 = x;
|
||||
VERIFY(moved == false);
|
||||
any a2;
|
||||
copied = false;
|
||||
a2 = std::move(a1);
|
||||
VERIFY(moved == false);
|
||||
VERIFY(copied == false);
|
||||
}
|
||||
|
||||
void test03()
|
||||
{
|
||||
moved = false;
|
||||
X2 x;
|
||||
any a1;
|
||||
a1 = x;
|
||||
VERIFY(copied && moved);
|
||||
any a2;
|
||||
moved = false;
|
||||
copied = false;
|
||||
a2 = std::move(a1);
|
||||
VERIFY(moved == true);
|
||||
VERIFY(copied == false);
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
test01();
|
||||
test02();
|
||||
test03();
|
||||
}
|
Loading…
Add table
Reference in a new issue