diff --git a/1984/decot/Makefile b/1984/decot/Makefile index 34285ebf0..8308646e5 100644 --- a/1984/decot/Makefile +++ b/1984/decot/Makefile @@ -42,7 +42,7 @@ CSILENCE= -Wno-array-bounds -Wno-error -Wno-implicit-function-declaration \ -Wno-keyword-macro -Wno-main-return-type -Wno-missing-field-initializers \ -Wno-unused-value -Wno-unused-variable -Wno-deprecated-non-prototype \ -Wno-empty-body -Wno-int-conversion -Wno-int-to-pointer-cast -Wno-main \ - -Wno-pointer-to-int-cast -Wno-return-type -Wno-unused-label + -Wno-pointer-to-int-cast -Wno-return-type -Wno-unused-label -Wno-implicit-int # Common C compiler warning flags # @@ -88,7 +88,7 @@ CC= cc ifeq "$(findstring $(CLANG),${CC})" "$(CLANG)" # CSILENCE+= -Wno-comma -Wno-format-nonliteral -Wno-missing-variable-declarations \ - -Wno-pedantic -Wno-poison-system-directories -Wno-strict-prototypes \ + -Wno-pedantic -Wno-poison-system-directories \ -Wno-cast-function-type -Wno-float-conversion -Wno-padded \ -Wno-unreachable-code # diff --git a/1984/decot/decot.c b/1984/decot/decot.c index 7aa30e532..d5de0d232 100644 --- a/1984/decot/decot.c +++ b/1984/decot/decot.c @@ -5,17 +5,14 @@ extern double floor(double); double (x1, y1) b; -/*char x {sizeof( - double(%s,%D)(*)()) */ -int -k['a'] = {sizeof( - int(*)()) +char x {sizeof( + double(%s,%D)(*)()) ,}; struct tag{int x0,*xO;}; -int dup, signal; -*main(int i) { +*main() { { + int i=1,signal, dup; for(signal=0;*k *= * __FILE__ *i;) do { (printf(&*"'\",x); /*\n\\", (*((int(*)())&floor))(i))); goto _0; diff --git a/thanks-for-fixes.md b/thanks-for-fixes.md index d41c30360..9c04acf39 100644 --- a/thanks-for-fixes.md +++ b/thanks-for-fixes.md @@ -78,18 +78,35 @@ original entry. Nevertheless those cannot be used. Later on Cody improved the fix to make it look rather more like the original by bringing back an extern declaration (slightly changing it to match the symbol that it is i.e. `extern double floor(double);` instead of `extern int floor;`) -and `double (x1, y1) b;`, commenting out only the code: +and also bringing back `double (x1, y1) b;` and even this funny code that could +be kept in: ```c +#define char k['a'] char x {sizeof( double(%s,%D)(*)()) ``` -and changing the type of `k` to be an `int`. +This does mean that there cannot be a second arg to `main()` +as clang requires that to be a `char **` and the `char` redefined would not +allow this. Some versions of clang say that `main()` must have either 0, 2 or 3 +args but these versions do not object to 1 arg. However as the `char` macro +seems more obscure and it is possible that a new version of clang will be even +more strict the `int i` parameter in `main()` was moved to be inside `main()`, +set to non-zero (setting `i` to 0 will not work). This way `main()` has zero +args. -Additionally, because of the `#define union static struct` there is no need to -have in the code `static struct` as we can have it like the original code which -has it as `union`. +Observe how on line 29 there is a call to `main()` which does pass in a +parameter. It has never been observed to be an error to pass in too many +parameters to a function (`main()` or otherwise - it warns with other functions +but does not appear to with `main()`) but only that `main()` itself has a +certain number of args (in some versions) and that the first arg is an `int` and +the others are `char **`s. This is why the arg was removed and the call to +`main()` was not updated beyond what had to be done to fix it for compilers that +do not support `-traditional-cpp`. + +If the ANSI C committee or a new version of clang messes this up (both of which +seems possible) it is easy to fix but it is hoped that this won't happen. Originally Yusuke supplied a patch so that this entry would compile with gcc - but not clang - or at least some versions.