File: macros.h

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (193 lines) | stat: -rw-r--r-- 6,278 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
#include <macros_impl.h>
#include <macros_private_impl.h>
#include <header_guard.h>
#include <not_a_header_guard.h>

// Get Clang's NULL.
#include <stddef.h>

#define M_PI 3.14159265358979
#define M_PIf 3.14159265358979F
#define GL_FALSE 0
#define GL_RGB 0x1907
#define GL_RGBA 0x1908
#define EOF (-1)
#define UINT32_MAX 0xFFFFFFFFU
#define INT64_MAX 0x7FFFFFFFFFFFFFFFLL
#if defined(_WIN32)
// MSVC compatibility will always return a signed value when the suffix is `LL`
// or `i64` and other targets will promote it to an unsigned type.
#define UINT64_MAX 0xFFFFFFFFFFFFFFFFULL
#else
#define UINT64_MAX 0xFFFFFFFFFFFFFFFFLL
#endif
#define MINUS_THREE -3
#define true 1
#define false 0
#define TRUE 1
#define FALSE 0

#define LL_TO_ULL 0x8000000000000000LL

#define A_PI M_PI

#define VERSION_STRING "Swift 1.0"
#define UTF8_STRING u8"Swift 🏃"
#define OBJC_STRING @"Unicode! ✨"
#define CF_STRING CFSTR("Swift")
#define INVALID_UTF8_STRING "\xFF\xFF\xFF\xFF\xFF\xFF"

#define INVALID_INTEGER_LITERAL_1 10_9
#define INVALID_INTEGER_LITERAL_2 10abc

// Check that macros that expand to macros from another module are imported
// correctly.
#define USES_MACRO_FROM_OTHER_MODULE_1 MACRO_FROM_IMPL
#define USES_MACRO_FROM_OTHER_MODULE_2 MACRO_FROM_PRIVATE_IMPL

// Should be suppressed during import.
#define NS_BLOCKS_AVAILABLE 1
#define CF_USE_OSBYTEORDER_H 1

#define NULL_VIA_NAME (NULL)
#define NULL_VIA_VALUE ((void *) 0)

#ifndef nil
# define nil ((id)0)
#endif
#define NULL_AS_NIL nil

#ifndef Nil
# define Nil ((Class)0)
#endif
#define NULL_AS_CLASS_NIL Nil

#define RECURSION RECURSION
#define REF_TO_RECURSION RECURSION

#define DISPATCH_TIME_NOW (0ull)
#define DISPATCH_TIME_FOREVER (~0ull)

// Bitwise Operations.

#define BIT_SHIFT_1 (1 << 0)
#define BIT_SHIFT_2 (1 << 2)
#define BIT_SHIFT_3 (3LL << 3)
#define BIT_SHIFT_4 (1U << 1)

#define STARTPOS_ATTRS 8
#define ATTR_BOLD      (1 << STARTPOS_ATTRS)
#define ATTR_ITALIC    (2 << STARTPOS_ATTRS)
#define ATTR_UNDERLINE (4 << STARTPOS_ATTRS)
#define ATTR_INVALID   (4 << MINUS_THREE) // Should skip. Negative shift.

#define RSHIFT_ONE     (UINT32_MAX >> 31)
#define RSHIFT_NEG     (MINUS_THREE >> 1)
#define RSHIFT_INVALID (0xFFFF >> MINUS_THREE) // Should skip. Negative shift.

#define XOR_HIGH (UINT64_MAX ^ UINT32_MAX)

// Integer Arithmetic.

#define ADD_ZERO        (0 + 0)
#define ADD_ONE         (ADD_ZERO + 1)
#define ADD_TWO         (ADD_ONE + ADD_ONE)
#define ADD_MINUS_TWO   (1 + MINUS_THREE)
#define ADD_MIXED_WIDTH (3 + 166LL)        // Result = 169LL.
#define ADD_MIXED_SIGN  (42U + 100LL)      // Result = 142LL.
#define ADD_UNDERFLOW   (0U + MINUS_THREE) // Result = (UINT32_MAX - 2)U.
#define ADD_OVERFLOW    (UINT32_MAX + 3)   // Result = 2U.

#define SUB_ONE         (ADD_TWO - 1)
#define SUB_ZERO        (SUB_ONE - SUB_ONE)
#define SUB_MINUS_ONE   (SUB_ZERO - SUB_ONE)
#define SUB_MIXED_WIDTH (64 - 22LL)                  // Result = 42LL.
#define SUB_MIXED_SIGN  (100U - 49)                  // Result = 51U.
#define SUB_UNDERFLOW   (0U - 1)                     // Result = (UINT32_MAX)U.
#define SUB_OVERFLOW    (UINT32_MAX - ADD_MINUS_TWO) // Result = 1U.

#define MULT_POS      (12 * 3)
#define MULT_NEG      (4 * MINUS_THREE)
#define MULT_MIXED_TYPES (2LL * UINT32_MAX) // Result = (2^33)LL

#define DIVIDE_INTEGRAL    (1024 / 8)
#define DIVIDE_NONINTEGRAL (3 / 2)
#define DIVIDE_MIXED_TYPES  (INT64_MAX / UINT32_MAX) // Result = (2^31)LL
#define DIVIDE_INVALID     (69 / 0) // Should skip. Divide by zero.

// Integer Comparisons.

#define EQUAL_FALSE            (99 == 66)
#define EQUAL_TRUE             (SUB_ONE == 1)
#define EQUAL_TRUE_MIXED_TYPES (UINT32_MAX == 4294967295LL)

#define GT_FALSE  (SUB_ONE > 50)
#define GT_TRUE   (INT64_MAX > UINT32_MAX)
#define MINUS_FIFTY (0 - 50)
#define GTE_FALSE (MINUS_FIFTY >= 50)
#define GTE_TRUE  (INT64_MAX >= UINT32_MAX)

#define LT_FALSE  (SUB_UNDERFLOW < UINT32_MAX)
#define MINUS_NINETY_NINE (-99)
#define MINUS_FORTY_TWO   (-42)
#define LT_TRUE   (MINUS_NINETY_NINE < MINUS_FORTY_TWO)
#define LTE_FALSE (ADD_ONE <= 0)
#define LTE_TRUE  (SUB_UNDERFLOW <= UINT32_MAX)

// Logical Comparisons

#define L_AND_TRUE    (1 && 1)
#define L_AND_FALSE   (0 && 1)
#define L_AND_TRUE_B  (EQUAL_TRUE && EQUAL_TRUE_MIXED_TYPES)
#define L_AND_FALSE_B (EQUAL_FALSE && EQUAL_TRUE)

#define L_OR_TRUE     (0 || 1)
#define L_OR_FALSE    (0 || 0)
#define L_OR_TRUE_B   (EQUAL_FALSE || EQUAL_TRUE)
#define L_OR_FALSE_B  (EQUAL_FALSE || L_OR_FALSE)

// Recursion with expressions
#define RECURSION_WITH_EXPR RECURSION_WITH_EXPR_HELPER + 1
#define RECURSION_WITH_EXPR_HELPER RECURSION_WITH_EXPR

#define RECURSION_WITH_EXPR2 RECURSION_WITH_EXPR2_HELPER
#define RECURSION_WITH_EXPR2_HELPER RECURSION_WITH_EXPR2 + 1

#define RECURSION_WITH_EXPR3 RECURSION_WITH_EXPR3_HELPER + 1
#define RECURSION_WITH_EXPR3_HELPER RECURSION_WITH_EXPR3 + 1


// Casts with problematic types
#define UNAVAILABLE_ONE ((unavailable_t)1)
typedef unsigned unavailable_t __attribute__((unavailable));
#define DEPRECATED_ONE ((deprecated_t)1)
typedef unsigned deprecated_t __attribute__((deprecated));
#define OKAY_TYPED_ONE ((okay_t)1)
typedef unsigned okay_t;

#define FUNC_LIKE_MACRO() 0
#define FUNC_LIKE_MACRO_2(PARAM) PARAM

// Unsupported binary arithmetic
#define INVALID_ARITHMETIC_1 5 + INVALID_INTEGER_LITERAL_1
#define INVALID_ARITHMETIC_2 INVALID_INTEGER_LITERAL_1 + ADD_TWO
#define INVALID_ARITHMETIC_3 ADD_TWO + INVALID_INTEGER_LITERAL_1
#define INVALID_ARITHMETIC_4                                                   \
  INVALID_INTEGER_LITERAL_1 - INVALID_INTEGER_LITERAL_1
#define INVALID_ARITHMETIC_5 1 + VERSION_STRING
#define INVALID_ARITHMETIC_6 1 + 'c'
#define INVALID_ARITHMETIC_7 3 % 2

// Unsupported literals
#define CHAR_LITERAL 'a'

// Unsupported macro structures
#define UNSUPPORTED_1 FUNC_LIKE_MACRO()
#define UNSUPPORTED_2 FUNC_LIKE_MACRO_2(1)
#define UNSUPPORTED_3 1 + FUNC_LIKE_MACRO_2(1)
#define UNSUPPORTED_4                                                          \
  extern bool globalFlag;                                                      \
  if (globalFlag) {                                                            \
    /* do something */                                                         \
  }
#define UNSUPPORTED_5 1 + 1 + 1