WPILibC++ 2027.0.0-alpha-3
Loading...
Searching...
No Matches
def.inc
Go to the documentation of this file.
1// Protocol Buffers - Google's data interchange format
2// Copyright 2023 Google LLC. All rights reserved.
3//
4// Use of this source code is governed by a BSD-style
5// license that can be found in the LICENSE file or at
6// https://developers.google.com/open-source/licenses/bsd
7
8/*
9 * This is where we define internal portability macros used across upb.
10 *
11 * All of these macros are undef'd in undef.inc to avoid leaking them to users.
12 *
13 * The correct usage is:
14 *
15 * // #include "upb/foobar.h"
16 * // #include "upb/baz.h"
17 *
18 * // MUST be last included header.
19 * #include "upb/port/def.inc"
20 *
21 * // Code for this file.
22 * // <...>
23 *
24 * // Can be omitted for .c files, required for .h.
25 * #include "upb/port/undef.inc"
26 *
27 * This file is private and must not be included by users!
28 */
29
30#if !((defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || \
31 (defined(__cplusplus) && __cplusplus >= 201703L) || \
32 (defined(_MSC_VER) && _MSC_VER >= 1900))
33#error upb requires C99 or C++17 or MSVC >= 2015.
34#endif
35
36#define UPB_BOOTSTRAP_STAGE 0
37#if _WIN32
38#pragma warning(push)
39#pragma warning(disable : 4018 4047 4116 4146 4200 4244 4267 4334 4646 4789)
40#elif defined(__clang__)
41#pragma clang diagnostic push
42#ifdef __cplusplus
43#pragma clang diagnostic ignored "-Wc99-extensions"
44#endif
45#pragma clang diagnostic ignored "-Wsign-compare"
46#pragma clang diagnostic ignored "-Wflexible-array-extensions"
47#elif defined(__GNUC__)
48#pragma GCC diagnostic push
49#pragma GCC diagnostic ignored "-Wint-to-pointer-cast"
50#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
51#pragma GCC diagnostic ignored "-Wpedantic"
52#ifndef __cplusplus
53#pragma GCC diagnostic ignored "-Wpointer-to-int-cast"
54#endif
55#pragma GCC diagnostic ignored "-Wclobbered"
56#pragma GCC diagnostic ignored "-Wsign-compare"
57#pragma GCC diagnostic ignored "-Wstringop-overflow"
58#pragma GCC diagnostic ignored "-Wstringop-overread"
59#pragma GCC diagnostic ignored "-Wtype-limits"
60#endif
61
62// Portable check for GCC minimum version:
63// https://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html
64#if defined(__GNUC__) && defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__)
65#define UPB_GNUC_MIN(x, y) \
66 (__GNUC__ > (x) || __GNUC__ == (x) && __GNUC_MINOR__ >= (y))
67#else
68#define UPB_GNUC_MIN(x, y) 0
69#endif
70
71// Macros for checking for compiler attributes, defined here to avoid the
72// problem described in
73// https://gcc.gnu.org/onlinedocs/cpp/_005f_005fhas_005fattribute.html.
74#ifdef __has_attribute
75#define UPB_HAS_ATTRIBUTE(x) __has_attribute(x)
76#else
77#define UPB_HAS_ATTRIBUTE(x) 0
78#endif
79
80#ifdef __has_builtin
81#define UPB_HAS_BUILTIN(x) __has_builtin(x)
82#else
83#define UPB_HAS_BUILTIN(x) 0
84#endif
85
86#ifdef __has_extension
87#define UPB_HAS_EXTENSION(x) __has_extension(x)
88#else
89#define UPB_HAS_EXTENSION(x) 0
90#endif
91
92#ifdef __has_feature
93#define UPB_HAS_FEATURE(x) __has_feature(x)
94#else
95#define UPB_HAS_FEATURE(x) 0
96#endif
97
98#include <assert.h>
99#include <setjmp.h>
100#include <stdbool.h>
101#include <stdint.h>
102#include <stdio.h>
103#include <stdlib.h>
104
105#ifndef UINTPTR_MAX
106Error, UINTPTR_MAX is undefined
107#endif
108
109#if UINTPTR_MAX == 0xffffffff
110#define UPB_SIZE(size32, size64) size32
111#else
112#define UPB_SIZE(size32, size64) size64
113#endif
114
115/* If we always read/write as a consistent type to each address, this shouldn't
116 * violate aliasing.
117 */
118#define UPB_PTR_AT(msg, ofs, type) ((type *)((char *)(msg) + (ofs)))
119
120// A flexible array member may have lower alignment requirements than the struct
121// overall - in that case, it can overlap with the trailing padding of the rest
122// of the struct, and a naive sizeof(base) + sizeof(flex) * count calculation
123// will not take into account that overlap, and allocate more than is required.
124#define UPB_SIZEOF_FLEX(type, member, count) \
125 UPB_MAX(sizeof(type), offsetof(type, member[count]))
126
127#define UPB_SIZEOF_FLEX_WOULD_OVERFLOW(type, member, count) \
128 (((SIZE_MAX - offsetof(type, member[0])) / \
129 (offsetof(type, member[1]) - offsetof(type, member[0]))) < (size_t)count)
130
131#define UPB_ARRAY_SIZE(arr) (sizeof(arr) / sizeof(arr[0]))
132
133#define UPB_MAPTYPE_STRING 0
134
135// UPB_EXPORT: always generate a public symbol.
136#if defined(__GNUC__) || defined(__clang__)
137#define UPB_EXPORT __attribute__((visibility("default"))) __attribute__((used))
138#else
139#define UPB_EXPORT
140#endif
141
142// UPB_INLINE: inline if possible, emit standalone code if required.
143#ifdef __cplusplus
144#define UPB_INLINE inline
145#elif defined(__GNUC__) || defined(__clang__)
146#define UPB_INLINE static __inline__
147#else
148#define UPB_INLINE static
149#endif
150
151// UPB_INLINE_IF_NOT_GCC: because gcc can be very noisy at times.
152#if defined(__GNUC__) && !defined(__clang__)
153#define UPB_INLINE_IF_NOT_GCC static
154#else
155#define UPB_INLINE_IF_NOT_GCC UPB_INLINE
156#endif
157
158#ifdef UPB_BUILD_API
159#define UPB_API UPB_EXPORT
160#define UPB_API_INLINE UPB_EXPORT
161#else
162#define UPB_API
163#define UPB_API_INLINE UPB_INLINE
164#endif
165
166#ifdef EXPORT_UPBC
167#define UPBC_API UPB_EXPORT
168#else
169#define UPBC_API
170#endif
171
172#if UPB_HAS_FEATURE(address_sanitizer) || defined(__SANITIZE_ADDRESS__)
173#define UPB_ASAN 1
174#else
175#define UPB_ASAN 0
176#endif
177
178#if UPB_HAS_FEATURE(hwaddress_sanitizer)
179#define UPB_HWASAN 1
180#define UPB_HWASAN_POISON_TAG 17
181#define UPB_MALLOC_ALIGN 16
182#else
183#define UPB_HWASAN 0
184#define UPB_MALLOC_ALIGN 8
185#endif
186
187#if UPB_HAS_FEATURE(thread_sanitizer) || defined(__SANITIZE_THREAD__)
188#define UPB_TSAN 1
189#else
190#define UPB_TSAN 0
191#endif
192
193// An unfortunate concession to C++17 and MSVC, which don't support zero-sized
194// structs.
195#if UPB_ASAN || UPB_HWASAN || UPB_TSAN
196#define UPB_XSAN_MEMBER upb_Xsan xsan;
197#define UPB_XSAN(st) (&(st)->xsan)
198#define UPB_XSAN_STRUCT_SIZE 1
199#else
200#define UPB_XSAN_MEMBER
201#define UPB_XSAN(st) (NULL)
202#define UPB_XSAN_STRUCT_SIZE 0
203#endif
204
205#define UPB_ALIGN_UP(size, align) (((size) + (align) - 1) / (align) * (align))
206#define UPB_ALIGN_DOWN(size, align) ((size) / (align) * (align))
207#define UPB_ALIGN_MALLOC(size) UPB_ALIGN_UP(size, UPB_MALLOC_ALIGN)
208
209#if __STDC_VERSION__ >= 202311L || UPB_HAS_EXTENSION(cxx_alignof) || \
210 defined(__cplusplus)
211#define UPB_ALIGN_OF(type) alignof(type)
212#elif __STDC_VERSION__ >= 201112L || UPB_HAS_EXTENSION(c_alignof)
213#define UPB_ALIGN_OF(type) _Alignof(type)
214#elif UPB_GNUC_MIN(2, 95)
215#define UPB_ALIGN_OF(type) __alignof__(type)
216#elif defined(_MSC_VER)
217#define UPB_ALIGN_OF(type) __alignof(type)
218#else
219#define UPB_ALIGN_OF(type) \
220 offsetof( \
221 struct { \
222 char c; \
223 type member; \
224 }, \
225 member)
226#endif
227
228#ifdef _MSC_VER
229// Some versions of our Windows compiler don't support the C11 syntax.
230#define UPB_ALIGN_AS(x) __declspec(align(x))
231#elif defined(__GNUC__)
232#define UPB_ALIGN_AS(x) __attribute__((aligned(x)))
233#else
234#define UPB_ALIGN_AS(x) _Alignas(x)
235#endif
236
237#if __STDC_VERSION__ >= 202311L || UPB_HAS_EXTENSION(cxx_static_assert) || \
238 defined(__cplusplus)
239#define UPB_STATIC_ASSERT(val, msg) static_assert((val), msg)
240#elif __STDC_VERSION__ >= 201112L || UPB_HAS_EXTENSION(c_static_assert) || \
241 UPB_GNUC_MIN(4, 6)
242#define UPB_STATIC_ASSERT(val, msg) _Static_assert((val), msg)
243#else
244// Unfortunately this hack doesn't work inside struct declarations, but it works
245// everywhere else
246#define UPB_STATIC_ASSERT_CONCAT_IMPL(s1, s2) s1##s2
247#define UPB_STATIC_ASSERT_CONCAT(s1, s2) UPB_STATIC_ASSERT_CONCAT_IMPL(s1, s2)
248#ifdef __COUNTER__
249#define UPB_STATIC_ASSERT(condition, message) \
250 typedef char UPB_STATIC_ASSERT_CONCAT(static_assertion_failure_, \
251 __COUNTER__)[(condition) ? 1 : -1]
252#else
253#define UPB_STATIC_ASSERT(condition, message) \
254 typedef char UPB_STATIC_ASSERT_CONCAT(static_assertion_failure_, \
255 __LINE__)[(condition) ? 1 : -1]
256#endif
257#endif
258
259// Hints to the compiler about likely/unlikely branches.
260#if defined(__GNUC__) || defined(__clang__)
261#define UPB_LIKELY(x) __builtin_expect((bool)(x), 1)
262#define UPB_UNLIKELY(x) __builtin_expect((bool)(x), 0)
263#else
264#define UPB_LIKELY(x) (x)
265#define UPB_UNLIKELY(x) (x)
266#endif
267
268#if UPB_HAS_BUILTIN(__builtin_expect_with_probability)
269#define UPB_UNPREDICTABLE(x) \
270 __builtin_expect_with_probability((bool)(x), 1, 0.5)
271#else
272#define UPB_UNPREDICTABLE(x) (x)
273#endif
274
275// Macros for function attributes on compilers that support them.
276#if defined(__GNUC__) || defined(__clang__)
277#define UPB_FORCEINLINE __inline__ __attribute__((always_inline)) static
278#define UPB_NOINLINE __attribute__((noinline))
279#define UPB_NORETURN __attribute__((__noreturn__))
280#define UPB_PRINTF(str, first_vararg) \
281 __attribute__((format(printf, str, first_vararg)))
282#elif defined(_MSC_VER)
283#define UPB_NOINLINE
284#define UPB_FORCEINLINE static
285#define UPB_NORETURN __declspec(noreturn)
286#define UPB_PRINTF(str, first_vararg)
287#else /* !defined(__GNUC__) */
288#define UPB_FORCEINLINE static
289#define UPB_NOINLINE
290#define UPB_NORETURN
291#define UPB_PRINTF(str, first_vararg)
292#endif
293
294#if defined(__clang__)
295#define UPB_NODEREF __attribute__((noderef))
296#else
297#define UPB_NODEREF
298#endif
299
300#define UPB_MAX(x, y) ((x) > (y) ? (x) : (y))
301#define UPB_MIN(x, y) ((x) < (y) ? (x) : (y))
302
303#define UPB_UNUSED(var) (void)(var)
304
305// UPB_ASSUME(): in release mode, we tell the compiler to assume this is true.
306#ifdef NDEBUG
307#ifdef __GNUC__
308#define UPB_ASSUME(expr) \
309 if (!(expr)) __builtin_unreachable()
310#elif defined _MSC_VER
311#define UPB_ASSUME(expr) \
312 if (!(expr)) __assume(0)
313#else
314#define UPB_ASSUME(expr) \
315 do { \
316 } while (false && (expr))
317#endif
318#else
319#define UPB_ASSUME(expr) assert(expr)
320#endif
321
322/* UPB_ASSERT(): in release mode, we use the expression without letting it be
323 * evaluated. This prevents "unused variable" warnings. */
324#ifdef NDEBUG
325#define UPB_ASSERT(expr) \
326 do { \
327 } while (false && (expr))
328#else
329#define UPB_ASSERT(expr) assert(expr)
330#endif
331
332#if defined(__GNUC__) || defined(__clang__)
333#define UPB_UNREACHABLE() \
334 do { \
335 assert(0); \
336 __builtin_unreachable(); \
337 } while (0)
338#elif defined(_MSC_VER)
339#define UPB_UNREACHABLE() \
340 do { \
341 assert(0); \
342 __assume(0); \
343 } while (0)
344#else
345#define UPB_UNREACHABLE() \
346 do { \
347 assert(0); \
348 } while (0)
349#endif
350
351#ifdef __ANDROID__
352#define UPB_DEFAULT_MAX_BLOCK_SIZE 8192
353#else
354#define UPB_DEFAULT_MAX_BLOCK_SIZE 32768
355#endif
356
357/* UPB_SETJMP() / UPB_LONGJMP() */
358// Android uses a custom libc that does not implement all of posix, but it has
359// had sigsetjmp/siglongjmp forever on arm and since API 12 on x86. Apple has
360// sigsetjmp, but does not define the posix feature test macro.
361#if defined(__APPLE__) || defined(_POSIX_C_SOURCE) || defined(__ANDROID__)
362// avoid setting/restoring signal mask, which involves costly syscalls
363#define UPB_SETJMP(buf) sigsetjmp(buf, 0)
364#define UPB_LONGJMP(buf, val) siglongjmp(buf, val)
365#elif defined(WASM_WAMR)
366#define UPB_SETJMP(buf) 0
367#define UPB_LONGJMP(buf, val) abort()
368#else
369#define UPB_SETJMP(buf) setjmp(buf)
370#define UPB_LONGJMP(buf, val) longjmp(buf, val)
371#endif
372
373#if ((__STDC_VERSION__ >= 201112L) && !defined(__STDC_NO_ATOMICS__)) || \
374 UPB_HAS_EXTENSION(c_atomic) || \
375 defined(__GNUC__) // GCC supported atomics as an extension before it
376 // supported __has_extension
377#define UPB_USE_C11_ATOMICS
378#elif defined(_MSC_VER)
379#define UPB_USE_MSC_ATOMICS
380#endif
381
382#if defined(UPB_USE_C11_ATOMICS)
383#define UPB_ATOMIC(T) _Atomic(T)
384#elif defined(UPB_USE_MSC_ATOMICS)
385#define UPB_ATOMIC(T) volatile T
386#else
387#define UPB_ATOMIC(T) T
388#endif
389
390/* UPB_PTRADD(ptr, ofs): add pointer while avoiding "NULL + 0" UB */
391#define UPB_PTRADD(ptr, ofs) ((ofs) ? (ptr) + (ofs) : (ptr))
392
393#define UPB_PRIVATE(x) x##_dont_copy_me__upb_internal_use_only
394
395#ifdef UPB_ALLOW_PRIVATE_ACCESS__FOR_BITS_ONLY
396#define UPB_ONLYBITS(x) x
397#else
398#define UPB_ONLYBITS(x) UPB_PRIVATE(x)
399#endif
400
401/* Configure whether fasttable is switched on or not. *************************/
402
403#if UPB_HAS_ATTRIBUTE(musttail)
404#define UPB_MUSTTAIL __attribute__((musttail))
405#else
406#define UPB_MUSTTAIL
407#endif
408
409#if UPB_HAS_ATTRIBUTE(preserve_none)
410#define UPB_PRESERVE_NONE __attribute__((preserve_none))
411#else
412#define UPB_PRESERVE_NONE
413#endif
414
415/* This check is not fully robust: it does not require that we have "musttail"
416 * support available. We need tail calls to avoid consuming arbitrary amounts
417 * of stack space.
418 *
419 * GCC/Clang can mostly be trusted to generate tail calls as long as
420 * optimization is enabled, but, debug builds will not generate tail calls
421 * unless "musttail" is available.
422 *
423 * We should probably either:
424 * 1. require that the compiler supports musttail.
425 * 2. add some fallback code for when musttail isn't available (ie. return
426 * instead of tail calling). This is safe and portable, but this comes at
427 * a CPU cost.
428 */
429#if (defined(__x86_64__) || defined(__aarch64__)) && defined(__GNUC__)
430#define UPB_FASTTABLE_SUPPORTED 1
431#else
432#define UPB_FASTTABLE_SUPPORTED 0
433#endif
434
435/* define UPB_ENABLE_FASTTABLE to force fast table support.
436 * This is useful when we want to ensure we are really getting fasttable,
437 * for example for testing or benchmarking. */
438#if defined(UPB_ENABLE_FASTTABLE)
439#if !UPB_FASTTABLE_SUPPORTED
440#error fasttable is x86-64/ARM64 only and requires GCC or Clang.
441#endif
442#define UPB_FASTTABLE 1
443/* Define UPB_TRY_ENABLE_FASTTABLE to use fasttable if possible.
444 * This is useful for releasing code that might be used on multiple platforms,
445 * for example the PHP or Ruby C extensions. */
446#elif defined(UPB_TRY_ENABLE_FASTTABLE)
447#define UPB_FASTTABLE UPB_FASTTABLE_SUPPORTED
448#else
449#define UPB_FASTTABLE 0
450#endif
451
452/* UPB_FASTTABLE_INIT() allows protos compiled for fasttable to gracefully
453 * degrade to non-fasttable if the runtime or platform do not support it. */
454#if !UPB_FASTTABLE
455#define UPB_FASTTABLE_INIT(...)
456#define UPB_FASTTABLE_MASK(mask) -1
457#else
458#define UPB_FASTTABLE_INIT(...) __VA_ARGS__
459#define UPB_FASTTABLE_MASK(mask) mask
460#endif
461
462#undef UPB_FASTTABLE_SUPPORTED
463
464/* Disable proto2 arena behavior (TEMPORARY) **********************************/
465
466#ifdef UPB_DISABLE_CLOSED_ENUM_CHECKING
467#define UPB_TREAT_CLOSED_ENUMS_LIKE_OPEN 1
468#else
469#define UPB_TREAT_CLOSED_ENUMS_LIKE_OPEN 0
470#endif
471
472#if defined(__cplusplus)
473#if defined(__clang__) || UPB_GNUC_MIN(6, 0)
474// https://gcc.gnu.org/gcc-6/changes.html
475#if __cplusplus >= 201402L
476#define UPB_DEPRECATED [[deprecated]]
477#else
478#define UPB_DEPRECATED __attribute__((deprecated))
479#endif
480#else
481#define UPB_DEPRECATED
482#endif
483#else
484#define UPB_DEPRECATED
485#endif
486
487#if defined(UPB_IS_GOOGLE3) && \
488 (!defined(UPB_BOOTSTRAP_STAGE) || UPB_BOOTSTRAP_STAGE != 0)
489#define UPB_DESC(sym) proto2_##sym
490#define UPB_DESC_MINITABLE(sym) &proto2__##sym##_msg_init
491#elif defined(UPB_IS_GOOGLE3) && defined(UPB_BOOTSTRAP_STAGE) && \
492 UPB_BOOTSTRAP_STAGE == 0
493#define UPB_DESC(sym) proto2_##sym
494#define UPB_DESC_MINITABLE(sym) proto2__##sym##_msg_init()
495#elif defined(UPB_BOOTSTRAP_STAGE) && UPB_BOOTSTRAP_STAGE == 0
496#define UPB_DESC(sym) google_protobuf_##sym
497#define UPB_DESC_MINITABLE(sym) google__protobuf__##sym##_msg_init()
498#else
499#define UPB_DESC(sym) google_protobuf_##sym
500#define UPB_DESC_MINITABLE(sym) &google__protobuf__##sym##_msg_init
501#endif
502
503#undef UPB_IS_GOOGLE3
504
505#ifdef __clang__
506#define UPB_NO_SANITIZE_ADDRESS __attribute__((no_sanitize("address")))
507#else
508#define UPB_NO_SANITIZE_ADDRESS
509#endif
510
511// Linker arrays combine elements from multiple translation units into a single
512// array that can be iterated over at runtime.
513//
514// It is an alternative to pre-main "registration" functions.
515//
516// Usage:
517//
518// // In N translation units.
519// UPB_LINKARR_APPEND(foo_array) static int elems[3] = {1, 2, 3};
520//
521// // At runtime:
522// UPB_LINKARR_DECLARE(foo_array, int);
523//
524// void f() {
525// const int* start = UPB_LINKARR_START(foo_array);
526// const int* stop = UPB_LINKARR_STOP(foo_array);
527// for (const int* p = start; p < stop; p++) {
528// // Windows can introduce zero padding, so we have to skip zeroes.
529// if (*p != 0) {
530// vec.push_back(*p);
531// }
532// }
533// }
534
535#if defined(__ELF__) || defined(__wasm__)
536
537#define UPB_LINKARR_APPEND(name) \
538 __attribute__((retain, used, \
539 section("linkarr_" #name))) UPB_NO_SANITIZE_ADDRESS
540#define UPB_LINKARR_DECLARE(name, type) \
541 extern type __start_linkarr_##name; \
542 extern type __stop_linkarr_##name; \
543 UPB_LINKARR_APPEND(name) type UPB_linkarr_internal_empty_##name[1]
544#define UPB_LINKARR_START(name) (&__start_linkarr_##name)
545#define UPB_LINKARR_STOP(name) (&__stop_linkarr_##name)
546
547#elif defined(__MACH__)
548
549/* As described in: https://stackoverflow.com/a/22366882 */
550#define UPB_LINKARR_APPEND(name) \
551 __attribute__((retain, used, \
552 section("__DATA,__la_" #name))) UPB_NO_SANITIZE_ADDRESS
553#define UPB_LINKARR_DECLARE(name, type) \
554 extern type __start_linkarr_##name __asm( \
555 "section$start$__DATA$__la_" #name); \
556 extern type __stop_linkarr_##name __asm( \
557 "section$end$__DATA$" \
558 "__la_" #name); \
559 UPB_LINKARR_APPEND(name) type UPB_linkarr_internal_empty_##name[1]
560#define UPB_LINKARR_START(name) (&__start_linkarr_##name)
561#define UPB_LINKARR_STOP(name) (&__stop_linkarr_##name)
562
563#elif defined(_MSC_VER) && defined(__clang__)
564
565/* See:
566 * https://devblogs.microsoft.com/oldnewthing/20181107-00/?p=100155
567 * https://devblogs.microsoft.com/oldnewthing/20181108-00/?p=100165
568 * https://devblogs.microsoft.com/oldnewthing/20181109-00/?p=100175 */
569
570// Usage of __attribute__ here probably means this is Clang-specific, and would
571// not work on MSVC.
572#define UPB_LINKARR_APPEND(name) \
573 __declspec(allocate("la_" #name "$j")) \
574 __attribute__((retain, used)) UPB_NO_SANITIZE_ADDRESS
575#define UPB_LINKARR_DECLARE(name, type) \
576 __declspec(allocate("la_" #name "$a")) type __start_linkarr_##name; \
577 __declspec(allocate("la_" #name "$z")) type __stop_linkarr_##name; \
578 UPB_LINKARR_APPEND(name) type UPB_linkarr_internal_empty_##name[1] = {0}
579#define UPB_LINKARR_START(name) (&__start_linkarr_##name)
580#define UPB_LINKARR_STOP(name) (&__stop_linkarr_##name)
581
582#else
583
584// Linker arrays are not supported on this platform. Make appends a no-op but
585// don't define the other macros.
586#define UPB_LINKARR_APPEND(name)
587
588#endif
589
590// Future versions of upb will include breaking changes to some APIs.
591// This macro can be set to enable these API changes ahead of time, so that
592// user code can be updated before upgrading versions of protobuf.
593#ifdef UPB_FUTURE_BREAKING_CHANGES
594
595#endif
Error
Definition def.inc:106