16cb35ede819b18376cc2e08d7bd83e86d4874755Eric Fiselier//===----------------------------------------------------------------------===//
26cb35ede819b18376cc2e08d7bd83e86d4874755Eric Fiselier//
36cb35ede819b18376cc2e08d7bd83e86d4874755Eric Fiselier//                     The LLVM Compiler Infrastructure
46cb35ede819b18376cc2e08d7bd83e86d4874755Eric Fiselier//
56cb35ede819b18376cc2e08d7bd83e86d4874755Eric Fiselier// This file is dual licensed under the MIT and the University of Illinois Open
66cb35ede819b18376cc2e08d7bd83e86d4874755Eric Fiselier// Source Licenses. See LICENSE.TXT for details.
76cb35ede819b18376cc2e08d7bd83e86d4874755Eric Fiselier//
86cb35ede819b18376cc2e08d7bd83e86d4874755Eric Fiselier//===----------------------------------------------------------------------===//
96cb35ede819b18376cc2e08d7bd83e86d4874755Eric Fiselier
106cb35ede819b18376cc2e08d7bd83e86d4874755Eric Fiselier// UNSUPPORTED: libcpp-no-exceptions
116cb35ede819b18376cc2e08d7bd83e86d4874755Eric Fiselier// MODULES_DEFINES: _LIBCPP_DEBUG=1
126cb35ede819b18376cc2e08d7bd83e86d4874755Eric Fiselier// MODULES_DEFINES: _LIBCPP_DEBUG_USE_EXCEPTIONS
136cb35ede819b18376cc2e08d7bd83e86d4874755Eric Fiselier
146cb35ede819b18376cc2e08d7bd83e86d4874755Eric Fiselier// Can't test the system lib because this test enables debug mode
156cb35ede819b18376cc2e08d7bd83e86d4874755Eric Fiselier// UNSUPPORTED: with_system_cxx_lib
166cb35ede819b18376cc2e08d7bd83e86d4874755Eric Fiselier
176cb35ede819b18376cc2e08d7bd83e86d4874755Eric Fiselier// test array<T, 0>::front() throws a debug exception.
186cb35ede819b18376cc2e08d7bd83e86d4874755Eric Fiselier
196cb35ede819b18376cc2e08d7bd83e86d4874755Eric Fiselier#define _LIBCPP_DEBUG 1
206cb35ede819b18376cc2e08d7bd83e86d4874755Eric Fiselier#define _LIBCPP_DEBUG_USE_EXCEPTIONS
216cb35ede819b18376cc2e08d7bd83e86d4874755Eric Fiselier#include <array>
226cb35ede819b18376cc2e08d7bd83e86d4874755Eric Fiselier
236cb35ede819b18376cc2e08d7bd83e86d4874755Eric Fiseliertemplate <class Array>
246cb35ede819b18376cc2e08d7bd83e86d4874755Eric Fiselierinline bool CheckDebugThrows(Array& Arr) {
256cb35ede819b18376cc2e08d7bd83e86d4874755Eric Fiselier  try {
266cb35ede819b18376cc2e08d7bd83e86d4874755Eric Fiselier    Arr.front();
276cb35ede819b18376cc2e08d7bd83e86d4874755Eric Fiselier  } catch (std::__libcpp_debug_exception const&) {
286cb35ede819b18376cc2e08d7bd83e86d4874755Eric Fiselier    return true;
296cb35ede819b18376cc2e08d7bd83e86d4874755Eric Fiselier  }
306cb35ede819b18376cc2e08d7bd83e86d4874755Eric Fiselier  return false;
316cb35ede819b18376cc2e08d7bd83e86d4874755Eric Fiselier}
326cb35ede819b18376cc2e08d7bd83e86d4874755Eric Fiselier
336cb35ede819b18376cc2e08d7bd83e86d4874755Eric Fiselierint main()
346cb35ede819b18376cc2e08d7bd83e86d4874755Eric Fiselier{
356cb35ede819b18376cc2e08d7bd83e86d4874755Eric Fiselier  {
366cb35ede819b18376cc2e08d7bd83e86d4874755Eric Fiselier    typedef std::array<int, 0> C;
376cb35ede819b18376cc2e08d7bd83e86d4874755Eric Fiselier    C c = {};
386cb35ede819b18376cc2e08d7bd83e86d4874755Eric Fiselier    C const& cc = c;
396cb35ede819b18376cc2e08d7bd83e86d4874755Eric Fiselier    assert(CheckDebugThrows(c));
406cb35ede819b18376cc2e08d7bd83e86d4874755Eric Fiselier    assert(CheckDebugThrows(cc));
416cb35ede819b18376cc2e08d7bd83e86d4874755Eric Fiselier  }
426cb35ede819b18376cc2e08d7bd83e86d4874755Eric Fiselier  {
436cb35ede819b18376cc2e08d7bd83e86d4874755Eric Fiselier    typedef std::array<const int, 0> C;
446cb35ede819b18376cc2e08d7bd83e86d4874755Eric Fiselier    C c = {{}};
456cb35ede819b18376cc2e08d7bd83e86d4874755Eric Fiselier    C const& cc = c;
466cb35ede819b18376cc2e08d7bd83e86d4874755Eric Fiselier    assert(CheckDebugThrows(c));
476cb35ede819b18376cc2e08d7bd83e86d4874755Eric Fiselier    assert(CheckDebugThrows(cc));
486cb35ede819b18376cc2e08d7bd83e86d4874755Eric Fiselier  }
496cb35ede819b18376cc2e08d7bd83e86d4874755Eric Fiselier}
50