Author: rsmith Date: Tue Oct 13 18:12:22 2015 New Revision: 250247 URL: http://llvm.org/viewvc/llvm-project?rev=250247&view=rev Log: Fix use of libc++ <foo.h> headers from within an 'extern "C"' context in C++98.
Previously, this resulted in us declaring a template for static_assert emulation within the 'extern "C"' context, which is ill-formed. Added: libcxx/trunk/test/std/depr/depr.c.headers/extern_c.pass.cpp Modified: libcxx/trunk/include/__config Modified: libcxx/trunk/include/__config URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/__config?rev=250247&r1=250246&r2=250247&view=diff ============================================================================== --- libcxx/trunk/include/__config (original) +++ libcxx/trunk/include/__config Tue Oct 13 18:12:22 2015 @@ -591,9 +591,11 @@ typedef unsigned int char32_t; #ifdef _LIBCPP_HAS_NO_STATIC_ASSERT +extern "C++" { template <bool> struct __static_assert_test; template <> struct __static_assert_test<true> {}; template <unsigned> struct __static_assert_check {}; +} #define static_assert(__b, __m) \ typedef __static_assert_check<sizeof(__static_assert_test<(__b)>)> \ _LIBCPP_CONCAT(__t, __LINE__) Added: libcxx/trunk/test/std/depr/depr.c.headers/extern_c.pass.cpp URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/depr/depr.c.headers/extern_c.pass.cpp?rev=250247&view=auto ============================================================================== --- libcxx/trunk/test/std/depr/depr.c.headers/extern_c.pass.cpp (added) +++ libcxx/trunk/test/std/depr/depr.c.headers/extern_c.pass.cpp Tue Oct 13 18:12:22 2015 @@ -0,0 +1,43 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// Sometimes C++'s <foo.h> headers get included within extern "C" contexts. This +// is ill-formed (no diagnostic required), per [using.headers]p3, but we permit +// it as an extension. + +extern "C" { +#include <assert.h> +// complex.h is not supported in extern "C". +#include <ctype.h> +#include <errno.h> +#include <fenv.h> +#include <float.h> +#include <inttypes.h> +#include <iso646.h> +#include <limits.h> +#include <locale.h> +#include <math.h> +#include <setjmp.h> +#include <signal.h> +#include <stdalign.h> +#include <stdarg.h> +#include <stdbool.h> +#include <stddef.h> +#include <stdint.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +// tgmath.h is not supported in extern "C". +#include <time.h> +// FIXME: #include <uchar.h> +#include <wchar.h> +#include <wctype.h> +} + +int main() {} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits