// { dg-require-namedlocale "" }

// Copyright (C) 2003, 2005 Free Software Foundation
//
// This file is part of the GNU ISO C++ Library.  This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 2, or (at your option)
// any later version.

// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING.  If not, write to the Free
// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
// USA.

// 22.1.1.2 locale constructors and destructors [lib.locale.cons]

#include <new>
#include <locale>
#include <cstdlib>
#include <cstring>
#include <testsuite_hooks.h>

int times_to_fail = 0;

void* allocate(std::size_t n)
{
  if (!times_to_fail--)
    return 0;

  void* ret = std::malloc(n ? n : 1);
  if (ret)
    std::memset(ret, 0xbc, n);
  return ret;
}

void deallocate(void* p)
{
  if (p)
    std::free(p);
}

void* operator new(std::size_t n) throw (std::bad_alloc)
{
  void* ret = allocate(n);
  if (!ret)
    throw std::bad_alloc();
  return ret;
}

void* operator new[](std::size_t n) throw (std::bad_alloc)
{
  void* ret = allocate(n);
  if (!ret)
    throw std::bad_alloc();
  return ret;
}

void operator delete(void* p) throw()
{
  deallocate(p);
}

void operator delete[](void* p) throw()
{
  deallocate(p);
}

void* operator new(std::size_t n, const std::nothrow_t&) throw()
{
  return allocate(n);
}

void* operator new[](std::size_t n, const std::nothrow_t&) throw()
{
  return allocate(n);
}

void operator delete(void* p, const std::nothrow_t&) throw()
{
  deallocate(p);
}

void operator delete[](void* p, const std::nothrow_t&) throw()
{
  deallocate(p);
}

// libstdc++/12352
void test01(int iters)
{
  bool test __attribute__((unused)) = true;

  for (int j = 0; j < iters; ++j)
    {
      for (int i = 0; i < 100; ++i)
	{
	  times_to_fail = i;
	  try
	    {
	      std::locale loc1 = std::locale("");
	      std::locale loc2(loc1, std::locale::classic(),
			       std::locale::numeric);
	    }
	  catch (std::exception&)
	    {
	    }
	}
    }
}

int main(int argc, char* argv[])
{
  int iters = 1;
  if (argc > 1)
    iters = std::atoi(argv[1]);
  if (iters < 1)
    iters = 1;
  test01(iters);

  return 0;
}
