diff --git a/default.config b/default.config index d5f7fbb..23c2c06 100644 --- a/default.config +++ b/default.config @@ -7,7 +7,7 @@ CMP_C=gcc CMP_CPP=g++ STD_C=c11 STD_CPP=c++17 -WARN_C="-Wall -Wno-discarded-qualifiers -Wno-int-conversion" +WARN_C="-Wall -Wno-discarded-qualifiers" WARN_CPP="-Wall" SRC_C="$( find src -name '*.c')" SRC_CPP="$( find src -name '*.cpp')" diff --git a/src/base/std.h b/src/base/std.h index c266406..81ebc95 100644 --- a/src/base/std.h +++ b/src/base/std.h @@ -77,6 +77,8 @@ typedef uint8 bool; a16,a17,a18,a19,a20,a21,a22,a23,\ a24,a25,a26,a27,a28,a29,a30,a31,\ a32,...) a32 +// Macro for counting variadic arguments +// (see usage in kprint.h) #define count_args(ARGS...) __count_args(\ ARGS,\ 32,31,30,29,28,27,26,25,\ @@ -84,6 +86,30 @@ typedef uint8 bool; 16,15,14,13,12,11,10,9,\ 8, 7, 6, 5, 4, 3, 2, 1, 0) +/* +Cross-platform warning supression. +WARNING_DISABLE( W_EXAMPLE, + some code producing W_EXAMPLE; +); +You can even embed it into macro in header (see kprint.h) +*/ +#ifdef _MSC_VER + #define PRAGMA_WARNING_PUSH __pragma(warning( push )) + #define DISABLE_WARNING(wNumber) __pragma(warning( disable : wNumber )) + #define PRAGMA_WARNING_POP __pragma(warning( pop )) +#else + #define _PRAGMA(P) _Pragma(#P) + #define PRAGMA_WARNING_PUSH _PRAGMA(GCC diagnostic push) + #define PRAGMA_WARNING_DISABLE(wName) _PRAGMA(GCC diagnostic ignored wName) + #define PRAGMA_WARNING_POP _PRAGMA(GCC diagnostic pop) + #define W_INT_CONVERSION "-Wint-conversion" +#endif +#define WARNING_DISABLE(WARNING, CODE)\ + PRAGMA_WARNING_PUSH\ + PRAGMA_WARNING_DISABLE(WARNING)\ + CODE;\ + PRAGMA_WARNING_POP + #if __cplusplus } #endif \ No newline at end of file diff --git a/src/kprint/kprint.h b/src/kprint/kprint.h index 6e0587a..3971cf2 100644 --- a/src/kprint/kprint.h +++ b/src/kprint/kprint.h @@ -57,13 +57,24 @@ typedef union { Maybe __ksprint(uint8 n, kprint_format* formats, __kprint_value_union* objects); -#define ksprint(ARGS...) __ksprint(count_args(ARGS), __kprint_argsToArrs(count_args(ARGS),ARGS, __32zeroes)) +#define ksprint(ARGS...) WARNING_DISABLE( W_INT_CONVERSION,\ + __ksprint(count_args(ARGS), __kprint_argsToArrs(count_args(ARGS),ARGS, __32zeroes))\ + ) Maybe __kfprint(FILE* fd, uint8 n, kprint_format* formats, __kprint_value_union* objects); -#define kfprint(FD, ARGS...) __kfprint(FD, count_args(ARGS), __kprint_argsToArrs(count_args(ARGS),ARGS, __32zeroes)) +#define kfprint(FD, ARGS...) WARNING_DISABLE( W_INT_CONVERSION,\ + __kfprint(FD, count_args(ARGS), __kprint_argsToArrs(count_args(ARGS),ARGS, __32zeroes))\ + ) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wint-conversion" void __kprint(uint8 n, kprint_format* formats, __kprint_value_union* objects); -#define kprint(ARGS...) __kprint(count_args(ARGS), __kprint_argsToArrs(count_args(ARGS),ARGS, __32zeroes)) +#define kprint(ARGS...) WARNING_DISABLE( W_INT_CONVERSION,\ + __kprint(count_args(ARGS), __kprint_argsToArrs(count_args(ARGS),ARGS, __32zeroes))\ + ) + + +#pragma GCC diagnostic pop // can take (bgColor | fgColor) void kprint_setColor(kprint_format f); diff --git a/tests/main.cpp b/tests/main.cpp index 1cd39e0..30bac68 100644 --- a/tests/main.cpp +++ b/tests/main.cpp @@ -19,6 +19,11 @@ int main(){ ktDescriptors_beginInit(); ktDescriptors_initKerepTypes(); ktDescriptors_endInit(); + for(ktid id=0; id