libc++ fails to build with exception disabled

Hi all,

I've tried to build libc++ on Linux using clang with LIBCXX_ENABLE_EXCEPTIONS=OFF in CMake-based build system, but got compilation error:

cd /home/kostya/src/git/libcxx/build-noexcept/lib && /usr/local/bin/clang++ -Dcxx_EXPORTS -D_LIBCPP_NO_EXCEPTIONS -DNDEBUG -fPIC -I/home/kostya/src/git/libcxx/include -nostdinc++ -std=c++0x -Wall -W -Wno-unused-parameter -Wwrite-strings -Wno-long-long -fno-exceptions -fPIC -o CMakeFiles/cxx.dir/__/src/debug.cpp.o -c /home/kostya/src/git/libcxx/src/debug.cpp
/home/kostya/src/git/libcxx/src/debug.cpp:149:13: error: cannot use 'throw' with exceptions disabled
            throw bad_alloc();
            ^
/home/kostya/src/git/libcxx/src/debug.cpp:170:9: error: cannot use 'throw' with exceptions disabled
        throw bad_alloc();
        ^
/home/kostya/src/git/libcxx/src/debug.cpp:405:13: error: cannot use 'throw' with exceptions disabled
            throw bad_alloc();
            ^
/home/kostya/src/git/libcxx/src/debug.cpp:427:13: error: cannot use 'throw' with exceptions disabled
            throw bad_alloc();
            ^
/home/kostya/src/git/libcxx/src/debug.cpp:448:9: error: cannot use 'throw' with exceptions disabled
        throw bad_alloc();
        ^
5 errors generated.

Is it a bug or LIBCXX_ENABLE_EXCEPTIONS option is not supported and should be removed?

It also fails to build with disabled c++0x:

cd /home/kostya/src/git/libcxx/build-noc++11/lib && /usr/local/bin/clang++ -Dcxx_EXPORTS -DNDEBUG -fPIC -I/home/kostya/src/git/libcxx/include -nostdinc++ -Wall -W -Wno-unused-parameter -Wwrite-strings -Wno-long-long -pedantic -fPIC -DLIBCXXRT -I/usr/local/src/libcxx/lib -o CMakeFiles/cxx.dir/__/src/future.cpp.o -c /home/kostya/src/git/libcxx/src/future.cpp
/home/kostya/src/git/libcxx/src/future.cpp:13:1: warning: inline namespaces are a C++11 feature [-Wc++11-extensions]
_LIBCPP_BEGIN_NAMESPACE_STD
^
/home/kostya/src/git/libcxx/include/__config:266:52: note: expanded from macro '_LIBCPP_BEGIN_NAMESPACE_STD'
#define _LIBCPP_BEGIN_NAMESPACE_STD namespace std {inline namespace _LIBCPP_NAMESPACE {
                                                   ^
/home/kostya/src/git/libcxx/src/future.cpp:32:13: error: no matching conversion for static_cast from 'int' to 'std::__1::future_errc'
    switch (static_cast<future_errc>(ev))
            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/kostya/src/git/libcxx/include/future:379:29: note: candidate constructor (the implicit copy constructor) not viable: no known conversion from 'int' to
      'const std::__1::future_errc' for 1st argument;
_LIBCPP_DECLARE_STRONG_ENUM(future_errc)
                            ^
/home/kostya/src/git/libcxx/include/__config:404:63: note: expanded from macro '_LIBCPP_DECLARE_STRONG_ENUM'
#define _LIBCPP_DECLARE_STRONG_ENUM(x) struct _LIBCPP_VISIBLE x { enum _
                                                              ^
/home/kostya/src/git/libcxx/include/future:386:36: note: candidate constructor not viable: no known conversion from 'int' to 'std::__1::future_errc::_' for 1st
      argument;
_LIBCPP_DECLARE_STRONG_ENUM_EPILOG(future_errc)
                                   ^
/home/kostya/src/git/libcxx/include/__config:407:27: note: expanded from macro '_LIBCPP_DECLARE_STRONG_ENUM_EPILOG'
    _LIBCPP_ALWAYS_INLINE x(_ __v) : __v_(__v) {} \
                          ^
1 warning and 1 error generated.

It is a bug that LIBCXX_ENABLE_EXCEPTIONS doesn't work with debug.cpp. It is also a bug (or actually incomplete feature) that debug.cpp is not currently supported at all. I expect you could simply remove it from your compile and things would just be ok.

Howard