Greetings,

I am finally getting back to my SD-6 C++ features test work.

This second part adds a __has_include function-like macro that will return true if a header exists. I also added a __has_include_next function-like macro as an extension. Clang has this extension.
These macros just wrap the built-ins introduced in the previous patch.

As requested by folk I have rearranged which language-feature macros are 
available with what .

There is one bit: arrays of runtime bound.  These got kicked out of C++14 I 
think and is languishing in a TS.
OTOH, we still support it.  It's better than the C99 version we supported.
What direction should I take?

Bootstrapped and tested under x86_64-linux.

OK?

Ed

2014-09-02  Edward Smith-Rowland  <3dw...@verizon.net>

        Implement SD-6: SG10 Feature Test Recommendations
        * c-cppbuiltin.c (c_cpp_builtins()): Define language feature
        macros and the __has_header macro.

Index: c-cppbuiltin.c
===================================================================
--- c-cppbuiltin.c      (revision 214680)
+++ c-cppbuiltin.c      (working copy)
@@ -794,6 +794,12 @@
   /* For stddef.h.  They require macros defined in c-common.c.  */
   c_stddef_cpp_builtins ();
 
+  /* Set include test macros for all C/C++ (not for just C++11 etc.)
+     the builtins __has_include__ and __has_include_next__ are defined
+     in libcpp.  */
+  cpp_define (pfile, "__has_include(STR)=__has_include__(STR)");
+  cpp_define (pfile, "__has_include_next(STR)=__has_include_next__(STR)");
+
   if (c_dialect_cxx ())
     {
       if (flag_weak && SUPPORTS_ONE_ONLY)
@@ -800,12 +806,57 @@
        cpp_define (pfile, "__GXX_WEAK__=1");
       else
        cpp_define (pfile, "__GXX_WEAK__=0");
+
       if (warn_deprecated)
        cpp_define (pfile, "__DEPRECATED");
+
       if (flag_rtti)
        cpp_define (pfile, "__GXX_RTTI");
+
       if (cxx_dialect >= cxx11)
         cpp_define (pfile, "__GXX_EXPERIMENTAL_CXX0X__");
+
+      /* Binary literals and variable length arrays have been allowed in g++
+        before C++11 and were standardized for C++14.  Runtime sized arrays
+        have C++14 semantics even for C++98.  */
+      if (!pedantic || cxx_dialect > cxx11)
+       {
+         cpp_define (pfile, "__cpp_binary_literals=201304");
+         cpp_define (pfile, "__cpp_runtime_arrays=201304");
+       }
+      if (cxx_dialect >= cxx11)
+       {
+         /* Set feature test macros for C++11  */
+         cpp_define (pfile, "__cpp_unicode_characters=200704");
+         cpp_define (pfile, "__cpp_raw_strings=200710");
+         cpp_define (pfile, "__cpp_unicode_literals=200710");
+         cpp_define (pfile, "__cpp_user_defined_literals=200809");
+         cpp_define (pfile, "__cpp_lambdas=200907");
+         cpp_define (pfile, "__cpp_constexpr=200704");
+         cpp_define (pfile, "__cpp_static_assert=200410");
+         cpp_define (pfile, "__cpp_decltype=200707");
+         cpp_define (pfile, "__cpp_attributes=200809");
+         cpp_define (pfile, "__cpp_rvalue_reference=200610");
+         cpp_define (pfile, "__cpp_variadic_templates=200704");
+         cpp_define (pfile, "__cpp_alias_templates=200704");
+         /* Return type deduction was added as an extension to C++11
+            and was standardized for C+14.  */
+         cpp_define (pfile, "__cpp_return_type_deduction=201304");
+       }
+      if (cxx_dialect > cxx11)
+       {
+         /* Set feature test macros for C++14  */
+         cpp_define (pfile, "__cpp_init_captures=201304");
+         cpp_define (pfile, "__cpp_generic_lambdas=201304");
+         //cpp_undef (pfile, "__cpp_constexpr");
+         //cpp_define (pfile, "__cpp_constexpr=201304");
+         cpp_define (pfile, "__cpp_decltype_auto=201304");
+         //cpp_define (pfile, "__cpp_aggregate_nsdmi=201304");
+         cpp_define (pfile, "__cpp_variable_templates=201304");
+         cpp_define (pfile, "__cpp_digit_separators=201309");
+         cpp_define (pfile, "__cpp_attribute_deprecated=201309");
+         //cpp_define (pfile, "__cpp_sized_deallocation=201309");
+       }
     }
   /* Note that we define this for C as well, so that we know if
      __attribute__((cleanup)) will interface with EH.  */

Reply via email to