Commit aee69156 by Ville Voutilainen Committed by Ville Voutilainen

Add tests for a const member and a reference member for launder.

* g++.dg/cpp1z/launder3.C: New.
* g++.dg/cpp1z/launder4.C: Likewise.
* g++.dg/cpp1z/launder5.C: Likewise.
* g++.dg/cpp1z/launder5.cc: Likewise.
* g++.dg/cpp1z/launder5.h: Likewise.
* g++.dg/cpp1z/launder6.C: Likewise.
* g++.dg/cpp1z/launder6.cc: Likewise.
* g++.dg/cpp1z/launder6.h: Likewise.

From-SVN: r241708
parent dcb466ec
2016-10-31 Ville Voutilainen <ville.voutilainen@gmail.com>
Add tests for a const member and a reference member for launder.
* g++.dg/cpp1z/launder3.C: New.
* g++.dg/cpp1z/launder4.C: Likewise.
* g++.dg/cpp1z/launder5.C: Likewise.
* g++.dg/cpp1z/launder5.cc: Likewise.
* g++.dg/cpp1z/launder5.h: Likewise.
* g++.dg/cpp1z/launder6.C: Likewise.
* g++.dg/cpp1z/launder6.cc: Likewise.
* g++.dg/cpp1z/launder6.h: Likewise.
2016-10-31 Jakub Jelinek <jakub@redhat.com>
PR c++/77948
......
// { dg-do run { target c++11 } }
// { dg-additional-options "-O2" }
#include <cassert>
void *
operator new (decltype (sizeof (0)), void *p)
{
return p;
}
namespace std
{
template <typename T>
T *
launder (T *p)
{
return __builtin_launder (p);
}
}
struct A
{
const int x;
};
struct B
{
A a;
};
int
main ()
{
B b{{42}};
new (&b.a) A{666};
assert(std::launder(&b.a)->x == 666);
}
// { dg-do run { target c++11 } }
// { dg-additional-options "-O2" }
#include <cassert>
void *
operator new (decltype (sizeof (0)), void *p)
{
return p;
}
namespace std
{
template <typename T>
T *
launder (T *p)
{
return __builtin_launder (p);
}
}
struct A
{
int& x;
};
struct B
{
A a;
};
int
main ()
{
int x = 42;
B b{{x}};
int y = 666;
new (&b.a) A{y};
assert(std::launder(&b.a)->x == 666);
}
// { dg-do run { target c++11 } }
// { dg-additional-options "-O2" }
// { dg-additional-sources "launder5.cc" }
#include <cassert>
#include "launder5.h"
namespace std
{
template <typename T>
T *
launder (T *p)
{
return __builtin_launder (p);
}
}
int
main ()
{
B b{{42}};
f(b);
assert(std::launder(&b.a)->x == 666);
}
#include "launder5.h"
void *
operator new (decltype (sizeof (0)), void *p)
{
return p;
}
void f(B& b)
{
new (&b.a) A{666};
}
#ifndef GCC_TEST_LAUNDER5_H
#define GCC_TEST_LAUNDER5_H
struct A
{
const int x;
};
struct B
{
A a;
};
void f(B& b);
#endif
// { dg-do run { target c++11 } }
// { dg-additional-options "-O2" }
// { dg-additional-sources "launder6.cc" }
#include <cassert>
#include "launder6.h"
namespace std
{
template <typename T>
T *
launder (T *p)
{
return __builtin_launder (p);
}
}
int
main ()
{
int x = 42;
B b{{x}};
f(b);
assert(std::launder(&b.a)->x == 666);
}
#include "launder6.h"
void *
operator new (decltype (sizeof (0)), void *p)
{
return p;
}
int y = 666;
void f(B& b)
{
new (&b.a) A{y};
}
#ifndef GCC_TEST_LAUNDER6_H
#define GCC_TEST_LAUNDER6_H
struct A
{
int& x;
};
struct B
{
A a;
};
void f(B& b);
#endif
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