[libcxx] Current test results on Linux against all supported ABI libraries

Hi All,

As I mentioned in a mail to cfe-commits, here are current (r174590 + all patches I mailed to cfe-commits today) libcxx test results for Linux against all supported ABI libraries.

There are 40 failures common to all ABI libraries. Many of these appear to be related to localisation differences between Linux and Darwin. Specifically, many tests fail due to the Linux localisations in UTF-8 being multibyte for things like thousands separators (i.e. non-breaking whitespace instead of just a space). I believe this issue in particular is a known problem. Now that Daniel has added XFAIL support to the libcxx tests we can probably suppress some of these (or split them to isolate and suppress platform differences better than we do right now).

When building with libc++abi there is one failiure in addition to those in the common set.

When building with libcxxrt there are two failures in addition to those in the common set.

When building with libsupc++ there are 59 failures in addition to those in the common set (this is largely due to lack of dependent EH ABI support).

Now, in detail, the 40 common failures are:
    depr/depr.c.headers/math_h.pass.cpp
    depr/exception.unexpected/set.unexpected/get_unexpected.pass.cpp
    diagnostics/syserr/syserr.errcat/syserr.errcat.objects/system_category.pass.cpp
    input.output/iostream.format/ext.manip/get_time.pass.cpp
    input.output/iostream.format/ext.manip/put_time.pass.cpp
    language.support/support.start.term/quick_exit.pass.cpp
    localization/locale.categories/category.collate/locale.collate.byname/compare.pass.cpp
    localization/locale.categories/category.ctype/locale.ctype.byname/narrow_1.pass.cpp
    localization/locale.categories/category.ctype/locale.ctype.byname/narrow_many.pass.cpp
    localization/locale.categories/category.ctype/locale.ctype.byname/widen_1.pass.cpp
    localization/locale.categories/category.ctype/locale.ctype.byname/widen_many.pass.cpp
    localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_ru_RU.pass.cpp
    localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_zh_CN.pass.cpp
    localization/locale.categories/category.monetary/locale.moneypunct.byname/decimal_point.pass.cpp
    localization/locale.categories/category.monetary/locale.moneypunct.byname/thousands_sep.pass.cpp
    localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_ru_RU.pass.cpp
    localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_zh_CN.pass.cpp
    localization/locale.categories/category.numeric/locale.nm.put/facet.num.put.members/put_long_double.pass.cpp
    localization/locale.categories/category.time/locale.time.get.byname/get_date.pass.cpp
    localization/locale.categories/category.time/locale.time.get.byname/get_date_wide.pass.cpp
    localization/locale.categories/category.time/locale.time.get.byname/get_one.pass.cpp
    localization/locale.categories/category.time/locale.time.get.byname/get_one_wide.pass.cpp
    localization/locale.categories/category.time/locale.time.get.byname/get_weekday.pass.cpp
    localization/locale.categories/category.time/locale.time.get.byname/get_weekday_wide.pass.cpp
    localization/locale.categories/category.time/locale.time.put.byname/put1.pass.cpp
    localization/locale.categories/category.time/locale.time.put/locale.time.put.members/put2.pass.cpp
    localization/locale.categories/facet.numpunct/locale.numpunct.byname/grouping.pass.cpp
    localization/locale.categories/facet.numpunct/locale.numpunct.byname/thousands_sep.pass.cpp
    numerics/c.math/cmath.pass.cpp
    re/re.alg/re.alg.match/awk.pass.cpp
    re/re.alg/re.alg.match/basic.pass.cpp
    re/re.alg/re.alg.match/ecma.pass.cpp
    re/re.alg/re.alg.match/extended.pass.cpp
    re/re.alg/re.alg.search/awk.pass.cpp
    re/re.alg/re.alg.search/basic.pass.cpp
    re/re.alg/re.alg.search/ecma.pass.cpp
    re/re.alg/re.alg.search/extended.pass.cpp
    re/re.traits/lookup_collatename.pass.cpp
    strings/c.strings/cuchar.pass.cpp
    strings/c.strings/version_cuchar.pass.cpp

The additional failures over the common set when using libc++abi are:
    depr/exception.unexpected/set.unexpected/set_unexpected.pass.cpp

The additional failures over the common set when using libcxxrt are:
    depr/exception.unexpected/set.unexpected/set_unexpected.pass.cpp
    localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/wchar_t_out.pass.cpp

And the additional failures over the common set when using libsupc++ are:
    language.support/support.exception/exception.terminate/set.terminate/get_terminate.pass.cpp
    language.support/support.exception/except.nested/assign.pass.cpp
    language.support/support.exception/except.nested/ctor_copy.pass.cpp
    language.support/support.exception/except.nested/ctor_default.pass.cpp
    language.support/support.exception/except.nested/rethrow_if_nested.pass.cpp
    language.support/support.exception/except.nested/rethrow_nested.pass.cpp
    language.support/support.exception/except.nested/throw_with_nested.pass.cpp
    language.support/support.exception/propagation/current_exception.pass.cpp
    language.support/support.exception/propagation/exception_ptr.pass.cpp
    language.support/support.exception/propagation/make_exception_ptr.pass.cpp
    language.support/support.exception/propagation/rethrow_exception.pass.cpp
    language.support/support.exception/uncaught/uncaught_exception.pass.cpp
    thread/futures/futures.async/async.pass.cpp
    thread/futures/futures.promise/alloc_ctor.pass.cpp
    thread/futures/futures.promise/default.pass.cpp
    thread/futures/futures.promise/dtor.pass.cpp
    thread/futures/futures.promise/get_future.pass.cpp
    thread/futures/futures.promise/move_assign.pass.cpp
    thread/futures/futures.promise/move_ctor.pass.cpp
    thread/futures/futures.promise/set_exception_at_thread_exit.pass.cpp
    thread/futures/futures.promise/set_exception.pass.cpp
    thread/futures/futures.promise/set_lvalue_at_thread_exit.pass.cpp
    thread/futures/futures.promise/set_lvalue.pass.cpp
    thread/futures/futures.promise/set_rvalue_at_thread_exit.pass.cpp
    thread/futures/futures.promise/set_rvalue.pass.cpp
    thread/futures/futures.promise/set_value_at_thread_exit_const.pass.cpp
    thread/futures/futures.promise/set_value_at_thread_exit_void.pass.cpp
    thread/futures/futures.promise/set_value_const.pass.cpp
    thread/futures/futures.promise/set_value_void.pass.cpp
    thread/futures/futures.promise/swap.pass.cpp
    thread/futures/futures.shared_future/copy_assign.pass.cpp
    thread/futures/futures.shared_future/copy_ctor.pass.cpp
    thread/futures/futures.shared_future/ctor_future.pass.cpp
    thread/futures/futures.shared_future/dtor.pass.cpp
    thread/futures/futures.shared_future/get.pass.cpp
    thread/futures/futures.shared_future/move_assign.pass.cpp
    thread/futures/futures.shared_future/move_ctor.pass.cpp
    thread/futures/futures.shared_future/wait_for.pass.cpp
    thread/futures/futures.shared_future/wait.pass.cpp
    thread/futures/futures.shared_future/wait_until.pass.cpp
    thread/futures/futures.tas/futures.task.members/assign_move.pass.cpp
    thread/futures/futures.tas/futures.task.members/ctor_func_alloc.pass.cpp
    thread/futures/futures.tas/futures.task.members/ctor_func.pass.cpp
    thread/futures/futures.tas/futures.task.members/ctor_move.pass.cpp
    thread/futures/futures.tas/futures.task.members/dtor.pass.cpp
    thread/futures/futures.tas/futures.task.members/get_future.pass.cpp
    thread/futures/futures.tas/futures.task.members/make_ready_at_thread_exit.pass.cpp
    thread/futures/futures.tas/futures.task.members/operator.pass.cpp
    thread/futures/futures.tas/futures.task.members/reset.pass.cpp
    thread/futures/futures.tas/futures.task.members/swap.pass.cpp
    thread/futures/futures.tas/futures.task.nonmembers/swap.pass.cpp
    thread/futures/futures.unique_future/dtor.pass.cpp
    thread/futures/futures.unique_future/get.pass.cpp
    thread/futures/futures.unique_future/move_assign.pass.cpp
    thread/futures/futures.unique_future/move_ctor.pass.cpp
    thread/futures/futures.unique_future/share.pass.cpp
    thread/futures/futures.unique_future/wait_for.pass.cpp
    thread/futures/futures.unique_future/wait.pass.cpp
    thread/futures/futures.unique_future/wait_until.pass.cpp

Michael

The additional failures over the common set when using libcxxrt are:
   depr/exception.unexpected/set.unexpected/set_unexpected.pass.cpp

This one was a stupid copy-and-paste error that I have now fixed (in both libcxxrt upstream and FreeBSD head. It will be merged to 9-STABLE shortly and should appear in 9.2).

localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/wchar_t_out.pass.cpp

I can't reproduce this on FreeBSD, but given the very poor support in glibc for the locale functions that libc++ needs I'm not surprised that there are bugs there. Can you give me a backtrace of where it fails?

David

Hi David,

The additional failures over the common set when using libcxxrt are:
  depr/exception.unexpected/set.unexpected/set_unexpected.pass.cpp

This one was a stupid copy-and-paste error that I have now fixed (in both libcxxrt upstream and FreeBSD head. It will be merged to 9-STABLE shortly and should appear in 9.2).

Confirmed as fixed here.

localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/wchar_t_out.pass.cpp

I can't reproduce this on FreeBSD, but given the very poor support in glibc for the locale functions that libc++ needs I'm not surprised that there are bugs there. Can you give me a backtrace of where it fails?

David

Core was generated by `/tmp/tmpti8F3zexe'.
Program terminated with signal 6, Aborted.
#0 0x00007fc0d8128e35 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:63
63 ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb) where
#0 0x00007fc0d8128e35 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:63
#1 0x00007fc0d812c498 in __GI_abort () at abort.c:90
#2 0x00007fc0d8121bd3 in __assert_fail_base (fmt=0x7fc0d8272170 "%s%s%s:%u: %s%sAssertion `%s' failed.\n%n", assertion=assertion@entry=0x4035fc "r == F::ok",
    file=file@entry=0x403607 "/home/michael/libcxx/test/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/wchar_t_out.pass.cpp", line=line@entry=37,
    function=function@entry=0x40368a "int main()") at assert.c:92
#3 0x00007fc0d8121c82 in __GI___assert_fail (assertion=0x4035fc "r == F::ok",
    file=0x403607 "/home/michael/libcxx/test/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/wchar_t_out.pass.cpp", line=37,
    function=0x40368a "int main()") at assert.c:101
#4 0x00000000004014b3 in main ()
(gdb)

It's not obvious to me how this particular failure is specific to libcxxrt. One thing that I do find a little strange is that libcxxrt links to libstdc++.so.6, so perhaps we're seeing a symbol conflict? That, however, is probably off-topic for this list :slight_smile:

Michael

libcxxrt should not be linked against libstdc++, so this is probably the source of your problems.

In FreeBSD, we ship a libstdc++ that can be linked against libcxxrt, but that's the other way around and requires some stuff with filter libraries to make it work without breaking the ABI.

David