mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-13 21:01:29 +08:00
[PR88534] accept VAR_DECL in class literal template parms
P0732R2 / C++ 2a introduce class literals as template parameters. The front-end uses VAR_DECLs constructed from such literals to bind the template PARM_DECLs, but dwarf2out.c used to reject such VAR_DECLs. Taking DECL_INITIAL from such VAR_DECLs enables the generation of DW_AT_const_value for them, at least when the class literal can actually be represented as such. for gcc/ChangeLog PR c++/88534 PR c++/88537 * dwarf2out.c (generic_parameter_die): Follow DECL_INITIAL of VAR_DECL args. for gcc/testsuite/ChangeLog PR c++/88534 PR c++/88537 * g++.dg/cpp2a/pr88534.C: New. * g++.dg/cpp2a/pr88537.C: New. From-SVN: r269709
This commit is contained in:
parent
d2025512b3
commit
ca7f909fba
@ -1,3 +1,10 @@
|
||||
2019-03-15 Alexandre Oliva <aoliva@redhat.com>
|
||||
|
||||
PR c++/88534
|
||||
PR c++/88537
|
||||
* dwarf2out.c (generic_parameter_die): Follow DECL_INITIAL of
|
||||
VAR_DECL args.
|
||||
|
||||
2019-03-15 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c++/89709
|
||||
|
@ -13603,6 +13603,13 @@ generic_parameter_die (tree parm, tree arg,
|
||||
dw_die_ref tmpl_die = NULL;
|
||||
const char *name = NULL;
|
||||
|
||||
/* C++2a accepts class literals as template parameters, and var
|
||||
decls with initializers represent them. The VAR_DECLs would be
|
||||
rejected, but we can take the DECL_INITIAL constructor and
|
||||
attempt to expand it. */
|
||||
if (arg && VAR_P (arg))
|
||||
arg = DECL_INITIAL (arg);
|
||||
|
||||
if (!parm || !DECL_NAME (parm) || !arg)
|
||||
return NULL;
|
||||
|
||||
|
@ -1,3 +1,10 @@
|
||||
2019-03-15 Alexandre Oliva <aoliva@redhat.com>
|
||||
|
||||
PR c++/88534
|
||||
PR c++/88537
|
||||
* g++.dg/cpp2a/pr88534.C: New.
|
||||
* g++.dg/cpp2a/pr88537.C: New.
|
||||
|
||||
2019-03-15 Robin Dapp <rdapp@linux.ibm.com>
|
||||
|
||||
* gcc.target/s390/target-attribute/tattr-1.c (htm0): -mhtm -> '-mhtm'.
|
||||
|
65
gcc/testsuite/g++.dg/cpp2a/pr88534.C
Normal file
65
gcc/testsuite/g++.dg/cpp2a/pr88534.C
Normal file
@ -0,0 +1,65 @@
|
||||
// { dg-do compile { target c++2a } }
|
||||
// { dg-options "-g" }
|
||||
|
||||
typedef __SIZE_TYPE__ size_t;
|
||||
|
||||
namespace std
|
||||
{
|
||||
|
||||
template <typename T, T... I>
|
||||
struct integer_sequence
|
||||
{
|
||||
typedef T value_type;
|
||||
static constexpr size_t size () noexcept { return sizeof...(I); }
|
||||
};
|
||||
|
||||
template <typename T, T N>
|
||||
using make_integer_sequence = integer_sequence<T, __integer_pack (N)...>;
|
||||
|
||||
template <size_t... I>
|
||||
using index_sequence = integer_sequence<size_t, I...>;
|
||||
|
||||
template <size_t N>
|
||||
using make_index_sequence = make_integer_sequence<size_t, N>;
|
||||
}
|
||||
|
||||
template <typename T, size_t N> struct S
|
||||
{
|
||||
T content[N];
|
||||
using char_type = T;
|
||||
template <size_t... I>
|
||||
constexpr S (const T (&input)[N], std::index_sequence<I...>) noexcept : content{input[I]...} { }
|
||||
constexpr S (const T (&input)[N]) noexcept : S (input, std::make_index_sequence<N> ()) { }
|
||||
constexpr size_t size () const noexcept
|
||||
{
|
||||
if (content[N - 1] == '\0')
|
||||
return N - 1;
|
||||
else
|
||||
return N;
|
||||
}
|
||||
constexpr T operator[] (size_t i) const noexcept
|
||||
{
|
||||
return content[i];
|
||||
}
|
||||
constexpr const T *begin () const noexcept
|
||||
{
|
||||
return content;
|
||||
}
|
||||
constexpr const T *end () const noexcept
|
||||
{
|
||||
return content + size ();
|
||||
}
|
||||
};
|
||||
|
||||
template <typename T, size_t N> S (const T (&)[N]) -> S<T, N>;
|
||||
|
||||
template <S S>
|
||||
struct F
|
||||
{
|
||||
};
|
||||
|
||||
auto
|
||||
foo ()
|
||||
{
|
||||
F<"test"> f;
|
||||
}
|
16
gcc/testsuite/g++.dg/cpp2a/pr88537.C
Normal file
16
gcc/testsuite/g++.dg/cpp2a/pr88537.C
Normal file
@ -0,0 +1,16 @@
|
||||
// { dg-do compile { target c++2a } }
|
||||
// { dg-options "-g" }
|
||||
|
||||
struct pair {
|
||||
unsigned a;
|
||||
unsigned b;
|
||||
constexpr pair(unsigned _a, unsigned _b) noexcept: a{_a}, b{_b} { }
|
||||
};
|
||||
|
||||
template <pair p> void fnc() {
|
||||
|
||||
}
|
||||
|
||||
void f() {
|
||||
fnc<pair(10,20)>();
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user