PR c++/92062 - ODR-use ignored for static member of class template.
has_value_dependent_address wasn't stripping location wrappers so it gave the wrong answer for "&x" in the static_assert. That led us to thinking that the expression isn't instantiation-dependent, and we skipped static initialization of A<0>::x. This patch adds stripping so that has_value_dependent_address gives the same answer as it used to before the location wrappers addition. * pt.c (has_value_dependent_address): Strip location wrappers. * g++.dg/cpp0x/constexpr-odr1.C: New test. * g++.dg/cpp0x/constexpr-odr2.C: New test. From-SVN: r277266
This commit is contained in:
parent
e011c0100a
commit
afa8c090bf
@ -1,3 +1,8 @@
|
||||
2019-10-21 Marek Polacek <polacek@redhat.com>
|
||||
|
||||
PR c++/92062 - ODR-use ignored for static member of class template.
|
||||
* pt.c (has_value_dependent_address): Strip location wrappers.
|
||||
|
||||
2019-10-21 Marek Polacek <polacek@redhat.com>
|
||||
|
||||
PR c++/92106 - ICE with structured bindings and -Wreturn-local-addr.
|
||||
|
@ -6542,6 +6542,8 @@ check_valid_ptrmem_cst_expr (tree type, tree expr,
|
||||
static bool
|
||||
has_value_dependent_address (tree op)
|
||||
{
|
||||
STRIP_ANY_LOCATION_WRAPPER (op);
|
||||
|
||||
/* We could use get_inner_reference here, but there's no need;
|
||||
this is only relevant for template non-type arguments, which
|
||||
can only be expressed as &id-expression. */
|
||||
|
@ -1,3 +1,9 @@
|
||||
2019-10-21 Marek Polacek <polacek@redhat.com>
|
||||
|
||||
PR c++/92062 - ODR-use ignored for static member of class template.
|
||||
* g++.dg/cpp0x/constexpr-odr1.C: New test.
|
||||
* g++.dg/cpp0x/constexpr-odr2.C: New test.
|
||||
|
||||
2019-10-21 Marek Polacek <polacek@redhat.com>
|
||||
|
||||
PR c++/92106 - ICE with structured bindings and -Wreturn-local-addr.
|
||||
|
19
gcc/testsuite/g++.dg/cpp0x/constexpr-odr1.C
Normal file
19
gcc/testsuite/g++.dg/cpp0x/constexpr-odr1.C
Normal file
@ -0,0 +1,19 @@
|
||||
// PR c++/92062 - ODR-use ignored for static member of class template.
|
||||
// { dg-do run { target c++11 } }
|
||||
|
||||
template<int> struct A {
|
||||
static const bool x;
|
||||
static_assert(&x, ""); // odr-uses A<...>::x
|
||||
};
|
||||
|
||||
int g;
|
||||
|
||||
template<int I>
|
||||
const bool A<I>::x = (g = 42, false);
|
||||
|
||||
void f(A<0>) {} // A<0> must be complete, so is instantiated
|
||||
int main()
|
||||
{
|
||||
if (g != 42)
|
||||
__builtin_abort ();
|
||||
}
|
19
gcc/testsuite/g++.dg/cpp0x/constexpr-odr2.C
Normal file
19
gcc/testsuite/g++.dg/cpp0x/constexpr-odr2.C
Normal file
@ -0,0 +1,19 @@
|
||||
// PR c++/92062 - ODR-use ignored for static member of class template.
|
||||
// { dg-do run { target c++11 } }
|
||||
|
||||
template<int> struct A {
|
||||
static const bool x;
|
||||
enum { force_instantiation =! &x}; // odr-uses A<...>::x
|
||||
};
|
||||
|
||||
int g;
|
||||
|
||||
template<int I>
|
||||
const bool A<I>::x = (g = 42, false);
|
||||
|
||||
void f(A<0>) {} // A<0> must be complete, so is instantiated
|
||||
int main()
|
||||
{
|
||||
if (g != 42)
|
||||
__builtin_abort ();
|
||||
}
|
Loading…
Reference in New Issue
Block a user