https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67737

Markus Trippelsdorf <trippels at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2015-09-28
            Summary|ICE in make_decl_rtl, at    |[C++1z] ICE in
                   |varasm.c:1299               |make_decl_rtl, at
                   |                            |varasm.c:1299
     Ever confirmed|0                           |1

--- Comment #6 from Markus Trippelsdorf <trippels at gcc dot gnu.org> ---
namespace std {
template <typename _Tp> struct A { static constexpr _Tp value = 1; };
template <typename, typename> struct is_same;
template <typename, typename _To> struct __is_convertible_helper {
  template <typename> static A<bool> __test();
  typedef decltype(__test<_To>()) type;
};
template <typename, typename>
struct is_convertible : __is_convertible_helper<int, int>::type {};
}
namespace detail_variadic_operator {
template <int...> struct and_c_impl { static constexpr int value = 1; };
}
template <int> constexpr bool and_c() {
  return detail_variadic_operator::and_c_impl<>::value;
}
namespace htl {
namespace empty_base_class_namespace {
template <class, class> struct Pack {
  template <class OtherValue> Pack(OtherValue);
};
template <class Tag, class Value> Value &unpack(Pack<Tag, Value>);
}
using empty_base_class_namespace::Pack;
namespace detail_tuple {
struct TupleBase {
  TupleBase(int);
};
}
template <class...> class Tuple : detail_tuple::TupleBase {
  using TupleBase::TupleBase;
};
}
using index_t = int;
template <class X> concept bool cpt_DynamicIndex() {
  return std::is_same<X, index_t>::value;
}
template <class X> concept bool cpt_Index() { return cpt_DynamicIndex<X>(); }
template <class X> concept bool cpt_Extent() {
  return std::is_convertible<X, index_t>::value;
}
template <class... Extents>
requires and_c<cpt_Index<Extents>()...>() class Shape;
namespace detail_concept {
template <class> int match_contiguous_shape;
template <class... Extents>
constexpr bool match_contiguous_shape<Shape<Extents>> = 1;
}
template <class X> concept bool cpt_ContiguousShape() {
  return detail_concept::match_contiguous_shape<X>;
}
template <class> using extent_type = decltype(0);
namespace detail_dimensionality {
struct extents_tag;
}
template <class... Extents>
class Dimensionality
    : htl::Pack<detail_dimensionality::extents_tag, htl::Tuple<Extents...>> {
  using Base =
      htl::Pack<detail_dimensionality::extents_tag, htl::Tuple<Extents...>>;

public:
  Dimensionality(Extents... extents) : Base(htl::Tuple<>(extents...)) {}
  decltype(auto) extents() { return unpack(*this); }
};
template <class... Extents>
requires and_c<cpt_Index<Extents>()...>() class Shape
    : public Dimensionality<Extents...> {
  using Base = Dimensionality<Extents...>;

public:
  Shape(Extents... extents) : Base(extents...) {}
};
template <cpt_Extent... Extents> auto make_shape(Extents... extents) {
  return Shape<extent_type<Extents>...>(extents...);
}
template <cpt_ContiguousShape Shape> auto make_subshape(Shape shape) {
  return shape.extents();
}
auto shape1 = make_shape(0);
auto subshape2 = make_subshape(shape1);

Reply via email to