# Copyright 2019 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Reserved words for Emboss. # # In the interest of avoiding problems during codegen, Emboss disallows fields, # types, and enum values that would collide with reserved words from a number # of languages. This (mostly) avoids cases where the back-end code generator # would want to emit a field accessor with the same name as a keyword. (Proto, # for example, handles this case by appending "_" to the field name if it # collides with a keyword; however, this is not documented, and Proto still # breaks if you happen to have fields named "struct" and "struct_" in the same # message.) # # Emboss reserves words from many languages, on the off chance that they will # someday have code generators, but there is an emphasis on systems languages # (such as C), hardware definition languages (such as Verilog), and languages # which can easily be used for handling binary data (such as Erlang). # # Non-blank/comment lines in this file take one of two forms: # # -- Source # word # # e.g.: # # -- C # int # long # _Bool # C99 # # -- Verilog # always # case # # A word may appear in multiple language sections. The first language name for # a word will be used in error messages when names matching that word are # found. # TODO(bolms): There still needs to be a way to override field names in # generated code. This list is *not* a complete list of every possible # reserved word -- such a list is impossible, given that language designers # continue to add new keywords to existing languages, new languages pop up, # standards such as POSIX reserve huge swathes of namespace for future # expansion (i.e., anything starting with E[A-Z0-9]), and different C and C++ # code bases may have custom preprocessor macros that collide with *anything*. -- C asm auto break case char const continue default do double else extern float for fortran goto if inline # C99 int long register restrict # C99 return short signed sizeof static switch typedef unsigned void volatile while _Alignas # C11 _Alignof # C11 _Atomic # C11 _Bool # C99 _Complex # C99 _Generic # C11 _Imaginary # C99 _Noreturn # C11 _Pragma # C99 _Static_assert # C11 _Thread_local # C11 # The following are *macros* defined in the C standard library. For the most # part, I do not think banning these will inconvenience many people. # NDEBUG static_assert assert # __STDC_NO_COMPLEX__ complex _Complex_I imaginary _Imaginary_I I CMPLX CMPLXF CMPLXL # errno EDOM EILSEQ ERANGE # FE_DIVBYZERO FE_INEXACT FE_INVALID FE_OVERFLOW FE_UNDERFLOW FE_ALL_EXCEPT FE_DOWNWARD FE_TONEAREST FE_TOWARDZERO FE_UPWARD FE_DFL_ENV # FLT_ROUNDS FLT_EVAL_METHOD FLT_HAS_SUBNORM DBL_HAS_SUBNORM LDBL_HAS_SUBNORM FLT_RADIX FLT_MANT_DIG DBL_MANT_DIG LDBL_MANT_DIG FLT_DECIMAL_DIG DBL_DECIMAL_DIG LDBL_DECIMAL_DIG DECIMAL_DIG FLT_DIG DBL_DIG LDBL_DIG FLT_MIN_EXP DBL_MIN_EXP LDBL_MIN_EXP FLT_MIN_10_EXP DBL_MIN_10_EXP LDBL_MIN_10_EXP FLT_MAX_EXP DBL_MAX_EXP LDBL_MAX_EXP FLT_MAX_10_EXP DBL_MAX_10_EXP LDBL_MAX_10_EXP FLT_MAX DBL_MAX LDBL_MAX FLT_EPSILON DBL_EPSILON LDBL_EPSILON FLT_MIN DBL_MIN LDBL_MIN FLT_TRUE_MIN DBL_TRUE_MIN LDBL_TRUE_MIN # # These are not frequently used in real C code, but then, it is hard to think # of a good reason to use these as field names. and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq # CHAR_BIT SCHAR_MIN SCHAR_MAX UCHAR_MAX CHAR_MIN CHAR_MAX MB_LEN_MAX SHRT_MIN SHRT_MAX USHRT_MAX INT_MIN INT_MAX UINT_MAX LONG_MIN LONG_MAX ULONG_MAX LLONG_MIN LLONG_MAX ULLONG_MAX # NULL LC_ALL LC_COLLATE LC_CTYPE LC_MONETARY LC_NUMERIC LC_TIME # HUGE_VAL HUGE_VALF HUGE_VALL INFINITY NAN FP_INFINITE FP_NAN FP_NORMAL FP_SUBNORMAL FP_ZERO FP_FAST_FMA FP_FAST_FMAF FP_FAST_FMAL FP_ILOGB0 FP_ILOGBNAN MATH_ERRNO MATH_ERREXCEPT math_errhandling fpclassify isfinite isinf isnan isnormal signbit isgreater isgreaterequal isless islessequal islessgreater isunordered # setjmp # Oddly, setjmp is a macro, but longjmp is not. # SIG_DFL SIG_ERR SIG_IGN SIGABRT SIGFPE SIGILL SIGINT SIGSEGV SIGTERM # alignas __alignas_is_defined # va_arg va_copy va_end va_start # __STDC_NO_ATOMICS__ ATOMIC_BOOL_LOCK_FREE ATOMIC_CHAR_LOCK_FREE ATOMIC_CHAR16_T_LOCK_FREE ATOMIC_CHAR32_T_LOCK_FREE ATOMIC_WCHAR_T_LOCK_FREE ATOMIC_SHORT_LOCK_FREE ATOMIC_INT_LOCK_FREE ATOMIC_LONG_LOCK_FREE ATOMIC_LLONG_LOCK_FREE ATOMIC_POINTER_LOCK_FREE ATOMIC_FLAG_INIT ATOMIC_VAR_INIT # Many of the following are listed by the standard as "generic functions" # instead of explicitly calling them out as macros. atomic_init kill_dependency atomic_is_lock_free atomic_store atomic_store_explicit atomic_load atomic_load_explicit atomic_exchange atomic_exchange_explicit atomic_compare_exchange_strong atomic_compare_exchange_strong_explicit atomic_compare_exchange_weak atomic_compare_exchange_weak_explicit atomic_fetch_add atomic_fetch_sub atomic_fetch_or atomic_fetch_xor atomic_fetch_and atomic_fetch_add_explicit atomic_fetch_sub_explicit atomic_fetch_or_explicit atomic_fetch_xor_explicit atomic_fetch_and_explicit # bool __bool_true_false_are_defined # NULL offsetof # INT16_C INT16_MAX INT16_MIN INT32_C INT32_MAX INT32_MIN INT64_C INT64_MAX INT64_MIN INT8_C INT8_MAX INT8_MIN INT_FAST16_MAX INT_FAST16_MIN INT_FAST32_MAX INT_FAST32_MIN INT_FAST64_MAX INT_FAST64_MIN INT_FAST8_MAX INT_FAST8_MIN INT_LEAST16_MAX INT_LEAST16_MIN INT_LEAST32_MAX INT_LEAST32_MIN INT_LEAST64_MAX INT_LEAST64_MIN INT_LEAST8_MAX INT_LEAST8_MIN INTMAX_C INTMAX_MAX INTMAX_MIN INTPTR_MAX INTPTR_MIN PTRDIFF_MAX PTRDIFF_MIN SIG_ATOMIC_MAX SIG_ATOMIC_MIN SIZE_MAX UINT16_C UINT16_MAX UINT32_C UINT32_MAX UINT64_C UINT64_MAX UINT8_C UINT8_MAX UINT_FAST16_MAX UINT_FAST32_MAX UINT_FAST64_MAX UINT_FAST8_MAX UINT_LEAST16_MAX UINT_LEAST32_MAX UINT_LEAST64_MAX UINT_LEAST8_MAX UINTMAX_C UINTMAX_MAX UINTPTR_MAX WCHAR_MAX WCHAR_MIN WINT_MAX WINT_MIN # NULL _IOFBF _IOLBF _IONBF BUFSIZ EOF FOPEN_MAX FILENAME_MAX L_tmpnam SEEK_CUR SEEK_END SEEK_SET TMP_MAX stderr stdin stdout L_tmpnam_s TMP_MAX_S # NULL EXIT_FAILURE EXIT_SUCCESS RAND_MAX MB_CUR_MAX # noreturn # NULL # acos asin atan acosh asinh atanh cos sin tan cosh sinh tanh exp log pow sqrt fabs atan2 cbrt ceil copysign erf erfc exp2 expm1 fdim floor fma fmax fmin fmod frexp hypot ilogb ldexp lgamma llrint llround log10 log1p log2 logb lrint lround nearbyint nextafter nexttoward remainder remquo rint round scalbn scalbln tgamma trunc carg cimag conj cproj creal # __STD_C_NO_THREADS__ thread_local ONCE_FLAG_INIT TSS_DTOR_ITERATIONS # NULL CLOCKS_PER_SEC TIME_UTC # has no macros. # NULL WCHAR_MAX WCHAR_MIN WEOF # WEOF -- C++ alignas # C++11 alignof # C++11 and and_eq asm auto bitand bitor bool break case catch char char16_t # C++11 char32_t # C++11 class compl concept # concepts TS const constexpr # C++11 const_cast continue decltype # C++11 default delete do double dynamic_cast else enum explicit export extern false float for friend goto if inline int long mutable namespace new noexcept # C++11 not not_eq nullptr # C++11 operator or or_eq private protected public register reinterpret_cast requires # concepts TS return short signed sizeof static static_assert # C++11 static_cast struct switch template this thread_local # C++11 throw true try typedef typeid typename union unsigned using virtual void volatile wchar_t while xor xor_eq -- System V libc # DOMAIN SING OVERFLOW UNDERFLOW TLOSS PLOSS -- BSD libc # MAXFLOAT M_E M_LOG2E M_LOG10E M_LN2 M_LN10 M_PI M_PI_2 M_PI_4 M_1_PI M_2_PI M_2_SQRTPI M_SQRT2 M_SQRT1_2 M_TWOPI M_3PI_4 M_SQRTPI M_LN2LO M_LN2HI M_SQRT3 M_IVLN10 M_LOG2_E M_INVLN2 -- Verilog # Verilog and System Verilog allow any keyword to be used as an identifier as # long as it is prefixed with '\' and followed by whitespace; e.g., \if . -- VHDL # VHDL allows any keyword to be used as an identifier by surrounding it with # '\' characters; e.g. \if\. -- Go break case chan const continue default defer else fallthrough for func go goto if import interface map package range return select switch type var -- Python 2 # Python 2-only keywords. exec print -- Python # Keywords in both Python 2 and 3. and as assert break class continue def del elif else except finally for from global if import in is lambda not or pass raise return try while with yield -- Python 3 # Python 3-only keywords. False None nonlocal print True -- Java abstract assert boolean break byte case catch char class const continue default do double else extends final finally float for goto if implements import instanceof int interface long native new package private protected public return short static strictfp super switch synchronized this throw throws transient try void volatile while -- Protocol Buffers # The protobuf compiler does not reserve *any* words. The following is a # perfectly valid .proto file: # # message message { # optional optional optional = 1; # }; # # message optional { # optional message message = 1; # }; # # Unsurprisingly, the same appears to be true of Cap'n'Proto. -- Dart assert break case catch class const continue default do else enum extends false final finally for if in is new null rethrow return super switch this throw true try var void while with -- Objective C auto break case CGFloat char const continue default do double else enum extern float for goto if implementation int interface long nonatomic NSInteger NSNumber NSObject _Packed property protocol readonly readwrite register retain return short signed sizeof static strong struct switch typedef union unsafe_unretained unsigned void volatile weak while -- Swift # Swift allows any name to be used as an identifier if it is enclosed in # backticks (e.g., `if`). -- Erlang after and andalso band begin bnot bor bsl bsr bxor case catch cond div end fun if let not of or orelse receive rem try when xor -- Rust abstract alignof as become box break const continue crate do else extern final fn for if impl in let loop macro match mod move mut offsetof override priv proc pub pure ref return self Self sizeof static super trait type typeof unsafe unsized use virtual where while yield -- C# # C# allows any name to be used as an identifier if it is prefixed with '@'; # e.g., @if. -- MATLAB break case catch classdef continue else elseif end for function global if otherwise parfor persistent return spmd switch try while