re PR c++/67161 (ICE with a static_assert using our internal __not/__or/__and traits)
authorJason Merrill <jason@redhat.com>
Wed, 12 Aug 2015 17:33:39 +0000 (13:33 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 12 Aug 2015 17:33:39 +0000 (13:33 -0400)
PR c++/67161
* error.c (dump_decl) [TEMPLATE_ID_EXPR]: Pass
TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS.

From-SVN: r226827

gcc/cp/ChangeLog
gcc/cp/error.c
gcc/testsuite/g++.dg/cpp1y/var-templ44.C [new file with mode: 0644]

index cdbe71913e1c47d775b0a7b1a585d77834b315df..bed0a5eb0234804436328fcab08be37f5c46936b 100644 (file)
@@ -1,3 +1,9 @@
+2015-08-12  Jason Merrill  <jason@redhat.com>
+
+       PR c++/67161
+       * error.c (dump_decl) [TEMPLATE_ID_EXPR]: Pass
+       TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS.
+
 2015-08-08  Jason Merrill  <jason@redhat.com>
 
        PR c++/67152
index 4f85751711a15c3136970d83c99ab8e01e9c2dfc..ae3e0921c5c9964b78bcc88944028330b7d7b4fe 100644 (file)
@@ -1212,7 +1212,8 @@ dump_decl (cxx_pretty_printer *pp, tree t, int flags)
        if (args == error_mark_node)
          pp_string (pp, M_("<template arguments error>"));
        else if (args)
-         dump_template_argument_list (pp, args, flags);
+         dump_template_argument_list
+           (pp, args, flags|TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS);
        pp_cxx_end_template_argument_list (pp);
       }
       break;
diff --git a/gcc/testsuite/g++.dg/cpp1y/var-templ44.C b/gcc/testsuite/g++.dg/cpp1y/var-templ44.C
new file mode 100644 (file)
index 0000000..2fc21a5
--- /dev/null
@@ -0,0 +1,29 @@
+// PR c++/67161
+// { dg-do compile { target c++14 } }
+
+template <typename _Tp> struct integral_constant {
+  static constexpr _Tp value = 0;
+};
+template <bool, typename, typename> struct conditional;
+template <typename...> struct __or_;
+template <typename _B1, typename _B2>
+struct __or_<_B1, _B2> : conditional<1, _B1, _B2>::type {};
+template <typename...> struct __and_;
+template <typename> struct __not_ : integral_constant<bool> {};
+template <typename> struct __is_void_helper : integral_constant<bool> {};
+template <typename> struct is_void : __is_void_helper<int> {};
+template <bool, typename _Iftrue, typename> struct conditional {
+  typedef _Iftrue type;
+};
+template <bool _Cond, typename _Iftrue, typename _Iffalse>
+using conditional_t = typename conditional<_Cond, _Iftrue, _Iffalse>::type;
+template <typename...> using common_type_t = int;
+template <typename, int> struct array {};
+template <typename _Tp> constexpr int is_void_v = is_void<_Tp>::value;
+template <typename _Dest = void, typename... _Types>
+constexpr auto make_array()
+    -> array<conditional_t<is_void_v<_Dest>, common_type_t<>, _Dest>,
+             sizeof...(_Types)> {
+  static_assert(__or_<__not_<is_void<_Dest>>, __and_<>>::value, ""); // { dg-error "static assert" }
+}
+auto d = make_array();