mirror of
https://github.com/gbdev/rgbds.git
synced 2025-11-20 10:12:06 +00:00
Build with pedantically standard C++ (#1309)
* Remove array designators (not standard C++) * Build with pedantically standard C++
This commit is contained in:
@@ -33,10 +33,11 @@ if(MSVC)
|
||||
add_link_options(${SAN_FLAGS})
|
||||
endif()
|
||||
else()
|
||||
# TODO: use -pedantic after non-C++ idioms are gone
|
||||
add_compile_options(-Wall)
|
||||
if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
|
||||
add_compile_options(-Wno-c99-designator)
|
||||
add_compile_options(-Wall -pedantic)
|
||||
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
||||
# C++20 allows macros to take zero variadic arguments, but Clang (aka AppleClang on macOS)
|
||||
# does not recognize this yet.
|
||||
add_compile_options(-Wno-gnu-zero-variadic-macro-arguments)
|
||||
endif()
|
||||
add_definitions(-D_POSIX_C_SOURCE=200809L)
|
||||
if(SANITIZERS)
|
||||
|
||||
4
Makefile
4
Makefile
@@ -25,8 +25,8 @@ PNGLDLIBS := `${PKG_CONFIG} --libs-only-l libpng`
|
||||
# Note: if this comes up empty, `version.cpp` will automatically fall back to last release number
|
||||
VERSION_STRING := `git --git-dir=.git describe --tags --dirty --always 2>/dev/null`
|
||||
|
||||
# TODO: use -pedantic after non-C++ idioms are gone
|
||||
WARNFLAGS := -Wall -Wno-unknown-warning-option -Wno-c99-designator
|
||||
WARNFLAGS := -Wall -pedantic -Wno-unknown-warning-option \
|
||||
-Wno-gnu-zero-variadic-macro-arguments
|
||||
|
||||
# Overridable CXXFLAGS
|
||||
CXXFLAGS ?= -O3 -flto -DNDEBUG
|
||||
|
||||
@@ -55,7 +55,8 @@ enum LexerMode {
|
||||
LEXER_RAW,
|
||||
LEXER_SKIP_TO_ELIF,
|
||||
LEXER_SKIP_TO_ENDC,
|
||||
LEXER_SKIP_TO_ENDR
|
||||
LEXER_SKIP_TO_ENDR,
|
||||
NB_LEXER_MODES
|
||||
};
|
||||
|
||||
void lexer_SetMode(enum LexerMode mode);
|
||||
|
||||
@@ -55,13 +55,6 @@
|
||||
#define NONNULL(ptr) *ptr // ptr[static 1]
|
||||
#define restrict
|
||||
|
||||
// C++ doesn't support designated array initializers, but they're a gcc extension
|
||||
#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
|
||||
# define AT(index) [index] =
|
||||
#else
|
||||
# define AT(index)
|
||||
#endif
|
||||
|
||||
// MSVC uses a different name for O_RDWR, and needs an additional _O_BINARY flag
|
||||
#ifdef _MSC_VER
|
||||
# include <fcntl.h>
|
||||
|
||||
@@ -2433,12 +2433,12 @@ int yylex(void)
|
||||
if (lexerState->atLineStart && !lexerState->expansions)
|
||||
nextLine();
|
||||
|
||||
static int (* const lexerModeFuncs[])(void) = {
|
||||
AT(LEXER_NORMAL) yylex_NORMAL,
|
||||
AT(LEXER_RAW) yylex_RAW,
|
||||
AT(LEXER_SKIP_TO_ELIF) yylex_SKIP_TO_ELIF,
|
||||
AT(LEXER_SKIP_TO_ENDC) yylex_SKIP_TO_ENDC,
|
||||
AT(LEXER_SKIP_TO_ENDR) yylex_SKIP_TO_ENDR,
|
||||
static int (* const lexerModeFuncs[NB_LEXER_MODES])(void) = {
|
||||
yylex_NORMAL,
|
||||
yylex_RAW,
|
||||
yylex_SKIP_TO_ELIF,
|
||||
yylex_SKIP_TO_ENDC,
|
||||
yylex_SKIP_TO_ENDR,
|
||||
};
|
||||
int token = lexerModeFuncs[lexerState->mode]();
|
||||
|
||||
|
||||
@@ -19,29 +19,29 @@ unsigned int nbErrors = 0;
|
||||
unsigned int maxErrors = 0;
|
||||
|
||||
static const enum WarningState defaultWarnings[ARRAY_SIZE(warningStates)] = {
|
||||
AT(WARNING_ASSERT) WARNING_ENABLED,
|
||||
AT(WARNING_BACKWARDS_FOR) WARNING_DISABLED,
|
||||
AT(WARNING_BUILTIN_ARG) WARNING_DISABLED,
|
||||
AT(WARNING_CHARMAP_REDEF) WARNING_DISABLED,
|
||||
AT(WARNING_DIV) WARNING_DISABLED,
|
||||
AT(WARNING_EMPTY_DATA_DIRECTIVE) WARNING_DISABLED,
|
||||
AT(WARNING_EMPTY_MACRO_ARG) WARNING_DISABLED,
|
||||
AT(WARNING_EMPTY_STRRPL) WARNING_DISABLED,
|
||||
AT(WARNING_LARGE_CONSTANT) WARNING_DISABLED,
|
||||
AT(WARNING_LONG_STR) WARNING_DISABLED,
|
||||
AT(WARNING_MACRO_SHIFT) WARNING_DISABLED,
|
||||
AT(WARNING_NESTED_COMMENT) WARNING_ENABLED,
|
||||
AT(WARNING_OBSOLETE) WARNING_ENABLED,
|
||||
AT(WARNING_SHIFT) WARNING_DISABLED,
|
||||
AT(WARNING_SHIFT_AMOUNT) WARNING_DISABLED,
|
||||
AT(WARNING_USER) WARNING_ENABLED,
|
||||
WARNING_ENABLED, // WARNING_ASSERT
|
||||
WARNING_DISABLED, // WARNING_BACKWARDS_FOR
|
||||
WARNING_DISABLED, // WARNING_BUILTIN_ARG
|
||||
WARNING_DISABLED, // WARNING_CHARMAP_REDEF
|
||||
WARNING_DISABLED, // WARNING_DIV
|
||||
WARNING_DISABLED, // WARNING_EMPTY_DATA_DIRECTIVE
|
||||
WARNING_DISABLED, // WARNING_EMPTY_MACRO_ARG
|
||||
WARNING_DISABLED, // WARNING_EMPTY_STRRPL
|
||||
WARNING_DISABLED, // WARNING_LARGE_CONSTANT
|
||||
WARNING_DISABLED, // WARNING_LONG_STR
|
||||
WARNING_DISABLED, // WARNING_MACRO_SHIFT
|
||||
WARNING_ENABLED, // WARNING_NESTED_COMMENT
|
||||
WARNING_ENABLED, // WARNING_OBSOLETE
|
||||
WARNING_DISABLED, // WARNING_SHIFT
|
||||
WARNING_DISABLED, // WARNING_SHIFT_AMOUNT
|
||||
WARNING_ENABLED, // WARNING_USER
|
||||
|
||||
AT(WARNING_NUMERIC_STRING_1) WARNING_ENABLED,
|
||||
AT(WARNING_NUMERIC_STRING_2) WARNING_DISABLED,
|
||||
AT(WARNING_TRUNCATION_1) WARNING_ENABLED,
|
||||
AT(WARNING_TRUNCATION_2) WARNING_DISABLED,
|
||||
AT(WARNING_UNMAPPED_CHAR_1) WARNING_ENABLED,
|
||||
AT(WARNING_UNMAPPED_CHAR_2) WARNING_DISABLED,
|
||||
WARNING_ENABLED, // WARNING_NUMERIC_STRING_1
|
||||
WARNING_DISABLED, // WARNING_NUMERIC_STRING_2
|
||||
WARNING_ENABLED, // WARNING_TRUNCATION_1
|
||||
WARNING_DISABLED, // WARNING_TRUNCATION_2
|
||||
WARNING_ENABLED, // WARNING_UNMAPPED_CHAR_1
|
||||
WARNING_DISABLED, // WARNING_UNMAPPED_CHAR_2
|
||||
};
|
||||
|
||||
enum WarningState warningStates[ARRAY_SIZE(warningStates)];
|
||||
|
||||
@@ -205,9 +205,9 @@ struct {
|
||||
char const *name;
|
||||
uint16_t max;
|
||||
} scrambleSpecs[SCRAMBLE_UNK] = {
|
||||
AT(SCRAMBLE_ROMX) { "romx", 65535 },
|
||||
AT(SCRAMBLE_SRAM) { "sram", 255 },
|
||||
AT(SCRAMBLE_WRAMX) { "wramx", 7 },
|
||||
{ "romx", 65535 }, // SCRAMBLE_ROMX
|
||||
{ "sram", 255 }, // SCRAMBLE_SRAM
|
||||
{ "wramx", 7 }, // SCRAMBLE_WRAMX
|
||||
};
|
||||
|
||||
static void parseScrambleSpec(char const *spec)
|
||||
|
||||
@@ -61,15 +61,15 @@ static enum SectionType typeMap[SECTTYPE_INVALID] = {
|
||||
|
||||
void out_AddSection(struct Section const *section)
|
||||
{
|
||||
static const uint32_t maxNbBanks[] = {
|
||||
AT(SECTTYPE_WRAM0) 1,
|
||||
AT(SECTTYPE_VRAM) 2,
|
||||
AT(SECTTYPE_ROMX) UINT32_MAX,
|
||||
AT(SECTTYPE_ROM0) 1,
|
||||
AT(SECTTYPE_HRAM) 1,
|
||||
AT(SECTTYPE_WRAMX) 7,
|
||||
AT(SECTTYPE_SRAM) UINT32_MAX,
|
||||
AT(SECTTYPE_OAM) 1,
|
||||
static const uint32_t maxNbBanks[SECTTYPE_INVALID] = {
|
||||
1, // SECTTYPE_WRAM0
|
||||
2, // SECTTYPE_VRAM
|
||||
UINT32_MAX, // SECTTYPE_ROMX
|
||||
1, // SECTTYPE_ROM0
|
||||
1, // SECTTYPE_HRAM
|
||||
7, // SECTTYPE_WRAMX
|
||||
UINT32_MAX, // SECTTYPE_SRAM
|
||||
1, // SECTTYPE_OAM
|
||||
};
|
||||
|
||||
uint32_t targetBank = section->bank - sectionTypeInfo[section->type].firstBank;
|
||||
|
||||
@@ -534,9 +534,9 @@ static void applyFilePatches(struct Section *section, struct Section *dataSectio
|
||||
int32_t min;
|
||||
int32_t max;
|
||||
} const types[PATCHTYPE_INVALID] = {
|
||||
AT(PATCHTYPE_BYTE) { 1, -128, 255 },
|
||||
AT(PATCHTYPE_WORD) { 2, -32768, 65536 },
|
||||
AT(PATCHTYPE_LONG) { 4, INT32_MIN, INT32_MAX },
|
||||
{ 1, -128, 255 }, // PATCHTYPE_BYTE
|
||||
{ 2, -32768, 65536 }, // PATCHTYPE_WORD
|
||||
{ 4, INT32_MIN, INT32_MAX }, // PATCHTYPE_LONG
|
||||
};
|
||||
|
||||
if (!isError && (value < types[patch->type].min
|
||||
|
||||
@@ -8,56 +8,56 @@ using namespace std::literals;
|
||||
// The default values are the most lax, as they are used as-is by RGBASM; only RGBLINK has the full info,
|
||||
// so RGBASM's job is only to catch unconditional errors earlier.
|
||||
struct SectionTypeInfo sectionTypeInfo[SECTTYPE_INVALID] = {
|
||||
AT(SECTTYPE_WRAM0) {
|
||||
{ // SECTTYPE_WRAM0
|
||||
.name = "WRAM0"s,
|
||||
.startAddr = 0xC000,
|
||||
.size = 0x2000, // Patched to 0x1000 if !isWRA0Mode
|
||||
.firstBank = 0,
|
||||
.lastBank = 0,
|
||||
},
|
||||
AT(SECTTYPE_VRAM) {
|
||||
{ // SECTTYPE_VRAM
|
||||
.name = "VRAM"s,
|
||||
.startAddr = 0x8000,
|
||||
.size = 0x2000,
|
||||
.firstBank = 0,
|
||||
.lastBank = 1, // Patched to 0 if isDmgMode
|
||||
},
|
||||
AT(SECTTYPE_ROMX) {
|
||||
{ // SECTTYPE_ROMX
|
||||
.name = "ROMX"s,
|
||||
.startAddr = 0x4000,
|
||||
.size = 0x4000,
|
||||
.firstBank = 1,
|
||||
.lastBank = 65535,
|
||||
},
|
||||
AT(SECTTYPE_ROM0) {
|
||||
{ // SECTTYPE_ROM0
|
||||
.name = "ROM0"s,
|
||||
.startAddr = 0x0000,
|
||||
.size = 0x8000, // Patched to 0x4000 if !is32kMode
|
||||
.firstBank = 0,
|
||||
.lastBank = 0,
|
||||
},
|
||||
AT(SECTTYPE_HRAM) {
|
||||
{ // SECTTYPE_HRAM
|
||||
.name = "HRAM"s,
|
||||
.startAddr = 0xFF80,
|
||||
.size = 0x007F,
|
||||
.firstBank = 0,
|
||||
.lastBank = 0,
|
||||
},
|
||||
AT(SECTTYPE_WRAMX) {
|
||||
{ // SECTTYPE_WRAMX
|
||||
.name = "WRAMX"s,
|
||||
.startAddr = 0xD000,
|
||||
.size = 0x1000,
|
||||
.firstBank = 1,
|
||||
.lastBank = 7,
|
||||
},
|
||||
AT(SECTTYPE_SRAM) {
|
||||
{ // SECTTYPE_SRAM
|
||||
.name = "SRAM"s,
|
||||
.startAddr = 0xA000,
|
||||
.size = 0x2000,
|
||||
.firstBank = 0,
|
||||
.lastBank = 255,
|
||||
},
|
||||
AT(SECTTYPE_OAM) {
|
||||
{ // SECTTYPE_OAM
|
||||
.name = "OAM"s,
|
||||
.startAddr = 0xFE00,
|
||||
.size = 0x00A0,
|
||||
@@ -67,7 +67,7 @@ struct SectionTypeInfo sectionTypeInfo[SECTTYPE_INVALID] = {
|
||||
};
|
||||
|
||||
char const * const sectionModNames[] = {
|
||||
AT(SECTION_NORMAL) "regular",
|
||||
AT(SECTION_UNION) "union",
|
||||
AT(SECTION_FRAGMENT) "fragment",
|
||||
"regular", // SECTION_NORMAL
|
||||
"union", // SECTION_UNION
|
||||
"fragment", // SECTION_FRAGMENT
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user