Mercurial > hg > CbC > CbC_gcc
comparison 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 |
comparison
equal
deleted
inserted
replaced
68:561a7518be6b | 111:04ced10e8804 |
---|---|
1 /* PR c++/66561 - __builtin_LINE at al. should yield constant expressions */ | |
2 /* { dg-do compile } */ | |
3 | |
4 #if __cplusplus >= 201103L | |
5 # define Assert(expr) static_assert ((expr), #expr) | |
6 #elif __STDC_VERSION__ >= 201112L | |
7 # define Assert(expr) _Static_assert ((expr), #expr) | |
8 #else | |
9 # define CONCAT(a, b) a ## b | |
10 # define CAT(a, b) CONCAT (a, b) | |
11 # define Assert(expr) typedef int CAT (Assert_, __LINE__) [1 - 2 * !(expr)] | |
12 #endif | |
13 | |
14 /* Verify (in C) that __builtin_FILE() yields an address constant. | |
15 This test is ineffective in C++ where initializers of global | |
16 objects need not be constant expressions. */ | |
17 const char* const file = __builtin_FILE (); | |
18 | |
19 /* Verify (in C) that __builtin_FUNCTION() yields an address constant. */ | |
20 const char* const function = __builtin_FUNCTION (); | |
21 | |
22 /* Also verify that __builtin_constant_p() returns true for both. */ | |
23 Assert (__builtin_constant_p (__builtin_FILE ())); | |
24 Assert (__builtin_constant_p (__builtin_FUNCTION ())); | |
25 | |
26 /* Verify (in both C and C++ 11 and later) that both __builtin_FILE () | |
27 and __builtin_FUNCTION() yield an address constant by making use | |
28 of a GCC extension that allows operands of arithmetic constant | |
29 expressions to be address constants. (Subtracting two literals | |
30 from one another is undefined in both C and C++ and should be | |
31 diagnosed. See c/70772.) */ | |
32 | |
33 #pragma GCC diagnostic push | |
34 #pragma GCC diagnostic ignored "-Waddress" | |
35 | |
36 enum E0 { | |
37 e0 = __FILE__ - __FILE__, | |
38 e1 = __builtin_FILE () - __builtin_FILE (), | |
39 | |
40 #if !__cplusplus || __cplusplus >= 201103L | |
41 /* Skip this test in C++ 98 where GCC rejects __FUNCTION__ in constant | |
42 expressions. */ | |
43 e2 = __FUNCTION__ - __FUNCTION__, | |
44 e3 = __builtin_FUNCTION () - __builtin_FUNCTION () | |
45 | |
46 #endif | |
47 }; | |
48 | |
49 #pragma GCC diagnostic pop | |
50 | |
51 /* Verify that __builtin_LINE () yields an integer constant expression. */ | |
52 #line 13 | |
53 int a [__builtin_LINE ()][__builtin_LINE ()]; | |
54 enum F { f0 = __builtin_LINE () }; | |
55 struct S { unsigned bitfield: __builtin_LINE (); } s; | |
56 | |
57 Assert (__builtin_constant_p (__builtin_LINE ())); |