diff gcc/testsuite/c-c++-common/builtin_location.c @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gcc/testsuite/c-c++-common/builtin_location.c	Fri Oct 27 22:46:09 2017 +0900
@@ -0,0 +1,57 @@
+/* PR c++/66561 - __builtin_LINE at al. should yield constant expressions */
+/* { dg-do compile } */
+
+#if __cplusplus >= 201103L
+#  define Assert(expr) static_assert ((expr), #expr)
+#elif __STDC_VERSION__ >= 201112L
+#  define Assert(expr) _Static_assert ((expr), #expr)
+#else
+#  define CONCAT(a, b)  a ## b
+#  define CAT(a, b)     CONCAT (a, b)
+#  define Assert(expr)  typedef int CAT (Assert_, __LINE__) [1 - 2 * !(expr)]
+#endif
+
+/* Verify (in C) that __builtin_FILE() yields an address constant.
+   This test is ineffective in C++ where initializers of global
+   objects need not be constant expressions.  */
+const char* const file = __builtin_FILE ();
+
+/* Verify (in C) that __builtin_FUNCTION() yields an address constant.  */
+const char* const function = __builtin_FUNCTION ();
+
+/* Also verify that __builtin_constant_p() returns true for both.  */
+Assert (__builtin_constant_p (__builtin_FILE ()));
+Assert (__builtin_constant_p (__builtin_FUNCTION ()));
+	
+/* Verify (in both C and C++ 11 and later) that both __builtin_FILE ()
+   and __builtin_FUNCTION() yield an address constant by making use
+   of a GCC extension that allows operands of arithmetic constant
+   expressions to be address constants.  (Subtracting two literals
+   from one another is undefined in both C and C++ and should be
+   diagnosed.  See c/70772.)  */
+
+#pragma GCC diagnostic push  
+#pragma GCC diagnostic ignored "-Waddress"
+
+enum E0 {
+  e0 = __FILE__ - __FILE__,
+  e1 = __builtin_FILE () - __builtin_FILE (),
+
+#if !__cplusplus || __cplusplus >= 201103L
+  /* Skip this test in C++ 98 where GCC rejects __FUNCTION__ in constant
+     expressions.  */
+  e2 = __FUNCTION__ - __FUNCTION__,
+  e3 = __builtin_FUNCTION () - __builtin_FUNCTION ()
+
+#endif
+};
+
+#pragma GCC diagnostic pop
+
+/* Verify that __builtin_LINE () yields an integer constant expression.  */
+#line 13
+int a [__builtin_LINE ()][__builtin_LINE ()];
+enum F { f0 = __builtin_LINE () };
+struct S { unsigned bitfield: __builtin_LINE (); } s;
+
+Assert (__builtin_constant_p (__builtin_LINE ()));