aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexandre Oliva <aoliva@redhat.com>2019-03-15 13:56:55 +0000
committerAlexandre Oliva <aoliva@gcc.gnu.org>2019-03-15 13:56:55 +0000
commitca7f909fba59f79d85f74ee0846bc9ed121ba7b2 (patch)
tree161d051727d53d881f25c5dbea2f6177cdc476be
parentd2025512b3fb357768d85ccde8e21f571481d00f (diff)
downloadgcc-ca7f909fba59f79d85f74ee0846bc9ed121ba7b2.zip
gcc-ca7f909fba59f79d85f74ee0846bc9ed121ba7b2.tar.gz
gcc-ca7f909fba59f79d85f74ee0846bc9ed121ba7b2.tar.bz2
[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
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/dwarf2out.c7
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/g++.dg/cpp2a/pr88534.C65
-rw-r--r--gcc/testsuite/g++.dg/cpp2a/pr88537.C16
5 files changed, 102 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d7a4f38..dfec589 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index d9cefd3..251fff7 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -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;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 285dc51..139e45a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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'.
diff --git a/gcc/testsuite/g++.dg/cpp2a/pr88534.C b/gcc/testsuite/g++.dg/cpp2a/pr88534.C
new file mode 100644
index 0000000..54faf38
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp2a/pr88534.C
@@ -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;
+}
diff --git a/gcc/testsuite/g++.dg/cpp2a/pr88537.C b/gcc/testsuite/g++.dg/cpp2a/pr88537.C
new file mode 100644
index 0000000..d558d45
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp2a/pr88537.C
@@ -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)>();
+}