[libcxx] r250247 - Fix use of libc++ <foo.h> headers from within an 'extern "C"' context in C++98.

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Tue Oct 13 16:12:22 PDT 2015


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() {}




More information about the cfe-commits mailing list