blob: 6bdf0c3697674f8b64e438d51d76776fcae728b6 [file] [log] [blame]
// C++26 P3068R5 - Allowing exception throwing in constant-evaluation
// { dg-do compile { target c++26 } }
// { dg-require-effective-target exceptions_enabled }
constexpr char p[] = "hello";
constexpr const char *q[] = { &p[0], &p[3] };
constexpr const char *const *r = &q[0];
const char *s[] = { &p[0], &p[3] };
constexpr const char **t = &s[0];
constexpr bool
foo ()
{
try
{
throw t;
}
catch (const char **const &x)
{
if (x != t)
return false;
try
{
throw;
}
catch (const char **&y)
{
if (y != t)
return false;
try
{
throw;
}
catch (const char **z)
{
if (z != t)
return false;
try
{
throw;
}
catch (const char *const *const &v)
{
if (v != (const char *const *) t)
return false;
try
{
throw;
}
catch (const char *const *w)
{
if (w != (const char *const *) t)
return false;
return true;
}
}
}
}
}
return false;
}
constexpr bool
bar ()
{
try
{
throw nullptr;
}
catch (const char **const &x)
{
if (x != nullptr)
return false;
try
{
throw;
}
catch (const char **&y)
{
if (y != nullptr)
return false;
try
{
throw;
}
catch (const char **z)
{
if (z != nullptr)
return false;
try
{
throw;
}
catch (const char *const *const &v)
{
if (v != nullptr)
return false;
try
{
throw;
}
catch (const char *const *w)
{
if (w != nullptr)
return false;
return true;
}
}
}
}
}
return false;
}
constexpr bool
baz ()
{
try
{
throw r;
}
catch (const char *const *const &x)
{
if (x != r || **x != 'h')
return false;
try
{
throw;
}
catch (const char *const *&y)
{
if (y != r || **y != 'h')
return false;
try
{
throw;
}
catch (const char *const *z)
{
if (z != r || **z != 'h')
return false;
return true;
}
}
}
return false;
}
static_assert (foo ());
static_assert (bar ());
static_assert (baz ());