public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [C++11, C++14  PATCH 2/3] Support for SD-6: SG10 Feature Test Recommendations - c-family and testsuite
@ 2014-05-31  3:43 Ed Smith-Rowland
  2014-05-31  6:30 ` Marc Glisse
  0 siblings, 1 reply; 4+ messages in thread
From: Ed Smith-Rowland @ 2014-05-31  3:43 UTC (permalink / raw)
  To: gcc-patches, Jason Merrill

[-- Attachment #1: Type: text/plain, Size: 102 bytes --]

This is the c-family part: Setting the language feature macos and 
defining the __has_include macro.


[-- Attachment #2: CL_feature_test_2 --]
[-- Type: text/plain, Size: 593 bytes --]


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.

[-- Attachment #3: patch_feature_test_2 --]
[-- Type: text/plain, Size: 10519 bytes --]

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
Index: testsuite/g++.dg/cpp1y/testinc/phoobhar.h
===================================================================
Index: testsuite/g++.dg/cpp1y/testinc/phoobhar.h
===================================================================

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [C++11, C++14  PATCH 2/3] Support for SD-6: SG10 Feature Test Recommendations - c-family and testsuite
  2014-05-31  3:43 [C++11, C++14 PATCH 2/3] Support for SD-6: SG10 Feature Test Recommendations - c-family and testsuite Ed Smith-Rowland
@ 2014-05-31  6:30 ` Marc Glisse
  2014-06-02 14:31   ` Jason Merrill
  0 siblings, 1 reply; 4+ messages in thread
From: Marc Glisse @ 2014-05-31  6:30 UTC (permalink / raw)
  To: Ed Smith-Rowland; +Cc: gcc-patches, Jason Merrill

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.

-- 
Marc Glisse

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [C++11, C++14  PATCH 2/3] Support for SD-6: SG10 Feature Test Recommendations - c-family and testsuite
  2014-05-31  6:30 ` Marc Glisse
@ 2014-06-02 14:31   ` Jason Merrill
  2014-06-02 15:06     ` Ed Smith-Rowland
  0 siblings, 1 reply; 4+ messages in thread
From: Jason Merrill @ 2014-06-02 14:31 UTC (permalink / raw)
  To: gcc-patches, Ed Smith-Rowland

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

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [C++11, C++14  PATCH 2/3] Support for SD-6: SG10 Feature Test Recommendations - c-family and testsuite
  2014-06-02 14:31   ` Jason Merrill
@ 2014-06-02 15:06     ` Ed Smith-Rowland
  0 siblings, 0 replies; 4+ messages in thread
From: Ed Smith-Rowland @ 2014-06-02 15:06 UTC (permalink / raw)
  To: Jason Merrill, gcc-patches

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
>
>

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2014-06-02 15:06 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-05-31  3:43 [C++11, C++14 PATCH 2/3] Support for SD-6: SG10 Feature Test Recommendations - c-family and testsuite Ed Smith-Rowland
2014-05-31  6:30 ` Marc Glisse
2014-06-02 14:31   ` Jason Merrill
2014-06-02 15:06     ` Ed Smith-Rowland

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).