diff mbox

[C++11,C++14,2/3] Support for SD-6: SG10 Feature Test Recommendations - c-family and testsuite

Message ID 53894FCF.1000802@verizon.net
State New
Headers show

Commit Message

Ed Smith-Rowland May 31, 2014, 3:43 a.m. UTC
This is the c-family part: Setting the language feature macos and 
defining the __has_include macro.
c-family:

2014-05-31  Ed Smith-Rowland  <3dw4rd@verizon.net>

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


libstdc++:

2014-05-31  Ed Smith-Rowland  <3dw4rd@verizon.net>

	Implement SD-6: SG10 Feature Test Recommendations
	* g++.dg/cpp1y/feat-cxx11-neg.C: New.
	* g++.dg/cpp1y/feat-cxx11.C: New.
	* g++.dg/cpp1y/feat-cxx14-neg.C: New.
	* g++.dg/cpp1y/feat-cxx14.C: New.
	* g++.dg/cpp1y/phoobhar.h: New.
	* g++.dg/cpp1y/testinc/phoobhar.h: New.
	* g++.dg/cpp1y/testinc/phoobhar.h: New.
Index: testsuite/g++.dg/cpp1y/testinc/phoobhar.h
===================================================================
Index: testsuite/g++.dg/cpp1y/testinc/phoobhar.h
===================================================================

Comments

Marc Glisse May 31, 2014, 6:30 a.m. UTC | #1
On Fri, 30 May 2014, Ed Smith-Rowland wrote:

> +	  cpp_undef (pfile, "__cpp_constexpr");
> +	  cpp_define (pfile, "__cpp_constexpr=201304");

Could you set the other value in an else branch to avoid a def undef redef 
game?

Also, I am pretty sure that gcc doesn't support the latest constexpr, we 
shouldn't define those macros lightly.
Jason Merrill June 2, 2014, 2:31 p.m. UTC | #2
On 05/31/2014 02:30 AM, Marc Glisse wrote:
> Also, I am pretty sure that gcc doesn't support the latest constexpr, we
> shouldn't define those macros lightly.

That's correct.  We should leave __cpp_constexpr at 200704 for now.

> I think having __has_include for all languages is fine since it is
> already in the implementation defined namespace.

Agreed.  These macros should be defined if the feature is supported.

Similarly, features of later standards that we implement in earlier 
conformance modes as extensions (specifically, init-captures and binary 
literals) should have the appropriate macros defined.

Jason
Ed Smith-Rowland June 2, 2014, 3:05 p.m. UTC | #3
On 06/02/2014 10:31 AM, Jason Merrill wrote:
> On 05/31/2014 02:30 AM, Marc Glisse wrote:
>> Also, I am pretty sure that gcc doesn't support the latest constexpr, we
>> shouldn't define those macros lightly.
>
> That's correct.  We should leave __cpp_constexpr at 200704 for now.
Right...  That was a testing thing I left in by accident to make sure 
supercedance would work.  Commented out. ;-)
>
>> I think having __has_include for all languages is fine since it is
>> already in the implementation defined namespace.
>
> Agreed.  These macros should be defined if the feature is supported.
>
I now have these for all C/C++ versions.  When I implemented these I 
thought "Why the heck hasn't the preprocessor had these for 20 years..."
> Similarly, features of later standards that we implement in earlier 
> conformance modes as extensions (specifically, init-captures and 
> binary literals) should have the appropriate macros defined.
Very good idea...
I'll research these. unless someone has a little list somewhere...?
>
> Jason
>
>
diff mbox

Patch

Index: c-family/c-cppbuiltin.c
===================================================================
--- c-family/c-cppbuiltin.c	(revision 211078)
+++ c-family/c-cppbuiltin.c	(working copy)
@@ -805,7 +805,43 @@ 
       if (flag_rtti)
 	cpp_define (pfile, "__GXX_RTTI");
       if (cxx_dialect >= cxx11)
-        cpp_define (pfile, "__GXX_EXPERIMENTAL_CXX0X__");
+	{
+          cpp_define (pfile, "__GXX_EXPERIMENTAL_CXX0X__");
+	  /* Set feature test macros for C++11  */
+	  cpp_define (pfile, "__has_include(STR)=__has_include__(STR)");
+	  cpp_define (pfile,
+		      "__has_include_next(STR)=__has_include_next__(STR)");
+
+	  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");
+	}
+      if (cxx_dialect > cxx11)
+	{
+	  /* Set feature test macros for C++14  */
+	  cpp_define (pfile, "__cpp_binary_literals=201304");
+	  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_return_type_deduction=201304");
+	  cpp_define (pfile, "__cpp_runtime_arrays=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.  */
Index: testsuite/g++.dg/cpp1y/feat-cxx11-neg.C
===================================================================
--- testsuite/g++.dg/cpp1y/feat-cxx11-neg.C	(revision 0)
+++ testsuite/g++.dg/cpp1y/feat-cxx11-neg.C	(working copy)
@@ -0,0 +1,35 @@ 
+// { dg-do compile { target c++11_only } }
+
+// These *are* defined in C++14 onwards.
+
+#ifndef __cpp_binary_literals
+#  error "__cpp_binary_literals" // { dg-error "error" }
+#endif
+
+#ifndef __cpp_init_captures
+#  error "__cpp_init_captures" // { dg-error "error" }
+#endif
+
+#ifndef __cpp_generic_lambdas
+#  error "__cpp_generic_lambdas" // { dg-error "error" }
+#endif
+
+#ifndef __cpp_decltype_auto
+#  error "__cpp_decltype_auto" // { dg-error "error" }
+#endif
+
+#ifndef __cpp_return_type_deduction
+#  error "__cpp_return_type_deduction" // { dg-error "error" }
+#endif
+
+#ifndef __cpp_runtime_arrays
+#  error "__cpp_runtime_arrays" // { dg-error "error" }
+#endif
+
+#ifndef __cpp_digit_separators
+#  error "__cpp_digit_separators" // { dg-error "error" }
+#endif
+
+#ifndef __cpp_attribute_deprecated
+#  error "__cpp_attribute_deprecated" // { dg-error "error" }
+#endif
Index: testsuite/g++.dg/cpp1y/feat-cxx11.C
===================================================================
--- testsuite/g++.dg/cpp1y/feat-cxx11.C	(revision 0)
+++ testsuite/g++.dg/cpp1y/feat-cxx11.C	(working copy)
@@ -0,0 +1,73 @@ 
+// { dg-do compile { target c++11_only } }
+
+#ifndef __cpp_unicode_characters
+#  error "__cpp_unicode_characters"
+#elif  __cpp_unicode_characters != 200704
+#  error "__cpp_unicode_characters != 200704"
+#endif
+
+#ifndef __cpp_raw_strings
+#  error "__cpp_raw_strings"
+#elif  __cpp_raw_strings != 200710
+#  error "__cpp_raw_strings != 200710"
+#endif
+
+#ifndef __cpp_unicode_literals
+#  error "__cpp_unicode_literals"
+#elif  __cpp_unicode_literals != 200710
+#  error "__cpp_unicode_literals != 200710"
+#endif
+
+#ifndef __cpp_user_defined_literals
+#  error "__cpp_user_defined_literals"
+#elif  __cpp_user_defined_literals != 200809
+#  error "__cpp_user_defined_literals != 200809"
+#endif
+
+#ifndef __cpp_lambdas
+#  error "__cpp_lambdas"
+#elif  __cpp_lambdas != 200907
+#  error "__cpp_lambdas != 200907"
+#endif
+
+#ifndef __cpp_constexpr
+#  error "__cpp_constexpr"
+#elif  __cpp_constexpr != 200704
+#  error "__cpp_constexpr != 200704"
+#endif
+
+#ifndef __cpp_static_assert
+#  error "__cpp_static_assert"
+#elif  __cpp_static_assert != 200410
+#  error "__cpp_static_assert != 200410"
+#endif
+
+#ifndef __cpp_decltype
+#  error "__cpp_decltype"
+#elif  __cpp_decltype != 200707
+#  error "__cpp_decltype != 200707"
+#endif
+
+#ifndef __cpp_attributes
+#  error "__cpp_attributes"
+#elif  __cpp_attributes != 200809
+#  error "__cpp_attributes != 200809"
+#endif
+
+#ifndef __cpp_rvalue_reference
+#  error "__cpp_rvalue_reference"
+#elif  __cpp_rvalue_reference != 200610
+#  error "__cpp_rvalue_reference != 200610"
+#endif
+
+#ifndef __cpp_variadic_templates
+#  error "__cpp_variadic_templates"
+#elif  __cpp_variadic_templates != 200704
+#  error "__cpp_variadic_templates != 200704"
+#endif
+
+#ifndef __cpp_alias_templates
+#  error "__cpp_alias_templates"
+#elif  __cpp_alias_templates != 200704
+#  error "__cpp_alias_templates != 200704"
+#endif
Index: testsuite/g++.dg/cpp1y/feat-cxx14-neg.C
===================================================================
--- testsuite/g++.dg/cpp1y/feat-cxx14-neg.C	(revision 0)
+++ testsuite/g++.dg/cpp1y/feat-cxx14-neg.C	(working copy)
@@ -0,0 +1,7 @@ 
+// { dg-do compile { target c++1y } }
+
+#ifndef __cpp_constexpr
+#  error "__cpp_constexpr"
+#elif __cpp_constexpr != 200704
+#  error "__cpp_constexpr" // { dg-error "error" }
+#endif
Index: testsuite/g++.dg/cpp1y/feat-cxx14.C
===================================================================
--- testsuite/g++.dg/cpp1y/feat-cxx14.C	(revision 0)
+++ testsuite/g++.dg/cpp1y/feat-cxx14.C	(working copy)
@@ -0,0 +1,186 @@ 
+// { dg-do compile { target c++1y } }
+// { dg-options "-I. -Itestinc" }
+
+// Begin C++11 tests.
+
+#ifndef __cpp_unicode_characters
+#  error "__cpp_unicode_characters"
+#endif
+
+#ifndef __cpp_raw_strings
+#  error "__cpp_raw_strings"
+#endif
+
+#ifndef __cpp_unicode_literals
+#  error "__cpp_unicode_literals"
+#endif
+
+#ifndef __cpp_user_defined_literals
+#  error "__cpp_user_defined_literals"
+#endif
+
+#ifndef __cpp_lambdas
+#  error "__cpp_lambdas"
+#endif
+
+#ifndef __cpp_constexpr
+#  error "__cpp_constexpr"
+#endif
+
+#ifndef __cpp_static_assert
+#  error "__cpp_static_assert"
+#endif
+
+#ifndef __cpp_decltype
+#  error "__cpp_decltype"
+#endif
+
+#ifndef __cpp_attributes
+#  error "__cpp_attributes"
+#endif
+
+#ifndef __cpp_rvalue_reference
+#  error "__cpp_rvalue_reference"
+#endif
+
+#ifndef __cpp_variadic_templates
+#  error "__cpp_variadic_templates"
+#endif
+
+// Begin C++14 tests.
+
+#ifndef __cpp_binary_literals
+#  error "__cpp_binary_literals"
+#endif
+
+#ifndef __cpp_init_captures
+#  error "__cpp_init_captures"
+#endif
+
+#ifndef __cpp_generic_lambdas
+#  error "__cpp_generic_lambdas"
+#endif
+
+#ifdef __cpp_constexpr
+#  if __cpp_constexpr < 201304
+#    error "__cpp_constexpr"
+#  endif
+#endif
+
+#ifndef __cpp_decltype_auto
+#  error "__cpp_decltype_auto"
+#endif
+
+#ifndef __cpp_return_type_deduction
+#  error "__cpp_return_type_deduction"
+#endif
+
+#ifndef __cpp_runtime_arrays
+#  error "__cpp_runtime_arrays"
+#endif
+
+//  Aggregate initializers not in yet.
+#ifdef __cpp_aggregate_nsdmi
+#  error "__cpp_aggregate_nsdmi"
+#endif
+
+//  Variable templates not in yet.
+#ifdef __cpp_variable_templates
+#  error "__cpp_variable_templates"
+#endif
+
+#ifndef __cpp_digit_separators
+#  error "__cpp_digit_separators"
+#endif
+
+#ifndef __cpp_attribute_deprecated
+#  error "__cpp_attribute_deprecated"
+#endif
+
+//  Sized deallocation not in yet.
+#ifdef __cpp_sized_deallocation
+#  error "__cpp_sized_deallocation"
+#endif
+
+// Begin include checks.
+
+//  Check for __has_include macro.
+#ifndef __has_include
+#  error "__has_include"
+#endif
+
+//  Quoted complex.h should find at least the bracket version (use operator).
+#if __has_include__ "complex.h"
+#else
+#  error "complex.h"
+#endif
+
+//  Try known bracket header (use operator).
+#if __has_include__(<complex>)
+#else
+#  error "<complex>"
+#endif
+
+//  Define and use a macro to invoke the operator.
+#define sluggo(TXT) __has_include__(TXT)
+
+#if sluggo(<complex>)
+#else
+#  error "<complex>"
+#endif
+
+#if ! sluggo(<complex>)
+#  error "<complex>"
+#else
+#endif
+
+//  Quoted complex.h should find at least the bracket version.
+#if __has_include("complex.h")
+#else
+#  error "complex.h"
+#endif
+
+//  Try known local quote header.
+#if __has_include("complex_literals.h")
+#else
+#  error "\"complex_literals.h\""
+#endif
+
+//  Try nonexistent bracket header.
+#if __has_include(<stuff>)
+#  error "<stuff>"
+#else
+#endif
+
+//  Try nonexistent quote header.
+#if __has_include("phlegm")
+#  error "\"phlegm\""
+#else
+#endif
+
+//  Test __has_include_next.
+#if __has_include("phoobhar.h")
+#  include "phoobhar.h"
+#else
+#  error "phoobhar.h"
+#endif
+
+//  Try a macro.
+#define COMPLEX_INC "complex.h"
+#if __has_include(COMPLEX_INC)
+#else
+#  error COMPLEX_INC
+#endif
+
+//  Realistic use of __has_include.
+#if __has_include(<array>)
+#  define STD_ARRAY 1
+#  include <array>
+  template<typename _Tp, size_t _Num>
+    using array = std::array<_Tp, _Num>;
+#elif __has_include(<tr1/array>)
+#  define TR1_ARRAY 1
+#  include <tr1/array>
+  template<typename _Tp, size_t _Num>
+    typedef std::tr1::array<_Tp, _Num> array;
+#endif
Index: testsuite/g++.dg/cpp1y/phoobhar.h
===================================================================
--- testsuite/g++.dg/cpp1y/phoobhar.h	(revision 0)
+++ testsuite/g++.dg/cpp1y/phoobhar.h	(working copy)
@@ -0,0 +1,16 @@ 
+
+int
+phoo();
+
+int
+bhar();
+
+#ifndef __has_include_next
+#  error "__has_include_next"
+#else
+#  if __has_include_next("phoobhar.h")
+#    include_next "phoobhar.h"
+#  else
+#    error "phoobhar.h"
+#  endif
+#endif