[all-commits] [llvm/llvm-project] a9c918: [libc++] Use the using_if_exists attribute when pr...

Louis Dionne via All-commits all-commits at lists.llvm.org
Fri Jun 4 06:55:53 PDT 2021


  Branch: refs/heads/main
  Home:   https://github.com/llvm/llvm-project
  Commit: a9c9183ca42629fa83cdda297d1d30c7bc1d7c91
      https://github.com/llvm/llvm-project/commit/a9c9183ca42629fa83cdda297d1d30c7bc1d7c91
  Author: Louis Dionne <ldionne.2 at gmail.com>
  Date:   2021-06-04 (Fri, 04 Jun 2021)

  Changed paths:
    M libcxx/include/__config
    M libcxx/include/cctype
    M libcxx/include/cfenv
    M libcxx/include/cinttypes
    M libcxx/include/clocale
    M libcxx/include/cmath
    M libcxx/include/csetjmp
    M libcxx/include/csignal
    M libcxx/include/cstdarg
    M libcxx/include/cstddef
    M libcxx/include/cstdint
    M libcxx/include/cstdio
    M libcxx/include/cstdlib
    M libcxx/include/cstring
    M libcxx/include/ctime
    M libcxx/include/cwchar
    M libcxx/include/cwctype

  Log Message:
  -----------
  [libc++] Use the using_if_exists attribute when provided

As discussed on cfe-dev [1], use the using_if_exists Clang attribute when
the compiler supports it. This makes it easier to port libc++ on top of
new platforms that don't fully support the C Standard library.

Previously, libc++ would fail to build when trying to import a missing
declaration in a <cXXXX> header. With the attribute, the declaration will
simply not be imported into namespace std, and hence it won't be available
for libc++ to use. In many cases, the declarations were *not* actually
required for libc++ to work (they were only surfaced for users to use
them as std::XXXX), so not importing them into namespace std is acceptable.

The same thing could be achieved by conscious usage of `#ifdef` along
with platform detection, however that quickly creates a maintenance
problem as libc++ is ported to new platforms. Furthermore, this problem
is exacerbated when mixed with vendor internal-only platforms, which can
lead to difficulties maintaining a downstream fork of the library.

For the time being, we only use the using_if_exists attribute when it
is supported. At some point in the future, we will start removing #ifdef
paths that are unnecessary when the attribute is supported, and folks
who need those #ifdef paths will be required to use a compiler that
supports the attribute.

[1]: http://lists.llvm.org/pipermail/cfe-dev/2020-June/066038.html

Differential Revision: https://reviews.llvm.org/D90257




More information about the All-commits mailing list