<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/54120>54120</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            why clang++ ignore -fpermissive but g++ works well? NEED HELP!!
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          jmp0x7c00
      </td>
    </tr>
</table>

<pre>
    g++ works well
```bash
g++ -fpermissive -m64 -O3  -Wall -Winit-self -Wreturn-type -Wno-pointer-arith -Waddress -Wsequence-point -Wformat-security -Wmissing-include-dirs -Wundef  -Wno-parentheses -Wcast-align -Wconversion  -Wnon-virtual-dtor -std=c++11 -Wno-write-strings -nostdinc -fvisibility=hidden -fpie -fstack-protector -IEnclave -I/opt/sgxsdk/include -I/opt/sgxsdk/include/libcxx -I/opt/sgxsdk/include/tlibc  -nostdinc++ -fpermissive -c Enclave/Enclave.cpp -o Enclave/Enclave.o  -pedantic
In file included from /opt/sgxsdk/include/sgx_edger8r.h:46,
                 from Enclave/Enclave_t.h:7,
                 from Enclave/Enclave.cpp:1:
/opt/sgxsdk/include/sgx_defs.h:49:38: warning: ISO C++ does not permit named variadic macros [-Wvariadic-macros]
   49 | #define SGX_UBRIDGE(attr, fname, args...) attr fname args
      |                                      ^~~
In file included from Enclave/Enclave_t.h:12,
                 from Enclave/Enclave.cpp:1:
Enclave/../Enclave/sgx_includes.h:248:15: warning: ISO C++ forbids zero-size array ‘data’ [-Wpedantic]
  248 |     char data[0] __attribute__ ((aligned (__alignof__ (long double))));
      |               ^
In file included from Enclave/Enclave_t.h:14,
                 from Enclave/Enclave.cpp:1:
/opt/sgxsdk/include/tlibc/stdlib.h:133:63: warning: extra ‘;’ [-Wpedantic]
  133 | _TLIBC_DEPRECATED_FUNCTION_(int     _TLIBC_CDECL_, rand, void);
      |                                                               ^
/opt/sgxsdk/include/tlibc/stdlib.h:134:68: warning: extra ‘;’ [-Wpedantic]
  134 | _TLIBC_DEPRECATED_FUNCTION_(void    _TLIBC_CDECL_, srand, unsigned);
      |                                                                    ^
/opt/sgxsdk/include/tlibc/stdlib.h:135:62: warning: extra ‘;’ [-Wpedantic]
  135 | _TLIBC_DEPRECATED_FUNCTION_(void    _TLIBC_CDECL_, exit, int);
      |                                                              ^
/opt/sgxsdk/include/tlibc/stdlib.h:136:63: warning: extra ‘;’ [-Wpedantic]
  136 | _TLIBC_DEPRECATED_FUNCTION_(void    _TLIBC_CDECL_, _Exit, int);
      |                                                               ^
/opt/sgxsdk/include/tlibc/stdlib.h:137:73: warning: extra ‘;’ [-Wpedantic]
  137 | _TLIBC_DEPRECATED_FUNCTION_(char *  _TLIBC_CDECL_, getenv, const char *);
      |                                                                         ^
/opt/sgxsdk/include/tlibc/stdlib.h:138:73: warning: extra ‘;’ [-Wpedantic]
  138 | _TLIBC_DEPRECATED_FUNCTION_(int     _TLIBC_CDECL_, system, const char *);
      |                                                                         ^
In file included from Enclave/Enclave.cpp:3:
/opt/sgxsdk/include/tlibc/string.h:87:80: warning: extra ‘;’ [-Wpedantic]
   87 | FUNCTION_(char * _TLIBC_CDECL_, strcat, char *, const char *);
      |                                                              ^

/opt/sgxsdk/include/tlibc/string.h:88:80: warning: extra ‘;’ [-Wpedantic]
   88 | FUNCTION_(char * _TLIBC_CDECL_, strcpy, char *, const char *);
      |                                                              ^

/opt/sgxsdk/include/tlibc/string.h:120:72: warning: extra ‘;’ [-Wpedantic]
  120 | _TLIBC_DEPRECATED_FUNCTION_(char * _TLIBC_CDECL_, strdup, const char *);
      |                                                                        ^
/opt/sgxsdk/include/tlibc/string.h:121:87: warning: extra ‘;’ [-Wpedantic]
  121 | N_(char * _TLIBC_CDECL_, stpcpy, char *dest, const char *src);
      |                                                              ^

In file included from Enclave/Enclave.cpp:5:
Enclave/sgx_funcs.h:16:8: warning: declaration of ‘size_t fwrite(void*, size_t, size_t, FILE*)’ conflicts with built-in declaration ‘long unsigned int fwrite(const void*, long unsigned int, long unsigned int, void*)’ [-Wbuiltin-declaration-mismatch]
   16 | size_t fwrite(void *buffer, size_t size, size_t cont, FILE *fd);
      |        ^~~~~~
In file included from Enclave/Enclave.cpp:8:
/opt/sgxsdk/include/tlibc/unistd.h:50:87: warning: extra ‘;’ [-Wpedantic]
   50 | N_(int _TLIBC_CDECL_, execl, const char *, const char *, ...);
      |                                                              ^

/opt/sgxsdk/include/tlibc/unistd.h:51:88: warning: extra ‘;’ [-Wpedantic]
   51 | _(int _TLIBC_CDECL_, execlp, const char *, const char *, ...);
      |                                                              ^

/opt/sgxsdk/include/tlibc/unistd.h:52:88: warning: extra ‘;’ [-Wpedantic]
   52 | _(int _TLIBC_CDECL_, execle, const char *, const char *, ...);
      |                                                              ^

/opt/sgxsdk/include/tlibc/unistd.h:53:84: warning: extra ‘;’ [-Wpedantic]
   53 | TION_(int _TLIBC_CDECL_, execv, const char *, char * const *);
      |                                                              ^

/opt/sgxsdk/include/tlibc/unistd.h:54:101: warning: extra ‘;’ [-Wpedantic]
   54 | CDECL_, execve, const char *, char * const *, char * const *);
      |                                                              ^

/opt/sgxsdk/include/tlibc/unistd.h:55:85: warning: extra ‘;’ [-Wpedantic]
   55 | ION_(int _TLIBC_CDECL_, execvp, const char *, char * const *);
      |                                                              ^

Enclave/Enclave.cpp: In function ‘void ecall_start(emu_args)’:
Enclave/Enclave.cpp:90:16: warning: invalid conversion from ‘void*’ to ‘player_input*’ [-fpermissive]
   90 |     ap = malloc(sizeof(struct player_input));
      |          ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      |                |
      |                void*
Enclave/Enclave.cpp:92:15: warning: invalid conversion from ‘void*’ to ‘uint16_t*’ {aka ‘short unsigned int*’} [-fpermissive]
   92 |     b = malloc(23040 * 2);
      |         ~~~~~~^~~~~~~~~~~
      |               |
      |               void*
Enclave/Enclave.cpp: In function ‘void ecall_disassemble(void*)’:
Enclave/Enclave.cpp:161:17: warning: invalid conversion from ‘void*’ to ‘gb_state*’ [-fpermissive]
  161 |     disassemble(s);
      |                 ^
      |                 |
      |                 void*
In file included from Enclave/Enclave.cpp:27:
Enclave/gbc/disassembler.h:10:35: note:   initializing argument 1 of ‘void disassemble(gb_state*)’
   10 | void disassemble(struct gb_state* state);
      |                  ~~~~~~~~~~~~~~~~~^~~~~
Enclave/Enclave.cpp: In function ‘void ecall_audio_update(void*)’:
Enclave/Enclave.cpp:167:18: warning: invalid conversion from ‘void*’ to ‘gb_state*’ [-fpermissive]
  167 |     audio_update(s);
      |                  ^
      |                  |
      |                  void*
In file included from Enclave/Enclave.cpp:26:
Enclave/gbc/audio.h:14:36: note:   initializing argument 1 of ‘void audio_update(gb_state*)’
   14 | void audio_update(struct gb_state *s);

```
clang++ reported many errors:
```bash
/usr/bin/clang++-8 -fpermissive -m64 -O3  -Wall -Winit-self -Wreturn-type -Wno-pointer-arith -Waddress -Wsequence-point -Wformat-security -Wmissing-include-dirs -Wundef  -Wno-parentheses -Wcast-align -Wconversion  -Wnon-virtual-dtor -std=c++11 -Wno-write-strings -nostdinc -fvisibility=hidden -fpie -fstack-protector -IEnclave -I/opt/sgxsdk/include -I/opt/sgxsdk/include/libcxx -I/opt/sgxsdk/include/tlibc  -nostdinc++ -fpermissive -c Enclave/Enclave.cpp -o Enclave/Enclave.o  -pedantic
In file included from Enclave/Enclave.cpp:1:
In file included from Enclave/Enclave_t.h:7:
In file included from /opt/sgxsdk/include/sgx_edger8r.h:46:
/opt/sgxsdk/include/sgx_defs.h:49:38: warning: named variadic macros are a GNU
      extension [-Wvariadic-macros]
#define SGX_UBRIDGE(attr, fname, args...) attr fname args
                                     ^
In file included from Enclave/Enclave.cpp:1:
In file included from Enclave/Enclave_t.h:9:
Enclave/../Enclave/gbc/types.h:93:9: warning: anonymous types declared in an
      anonymous union are an extension [-Wnested-anon-types]
        struct {
        ^
Enclave/../Enclave/gbc/types.h:96:9: warning: anonymous types declared in an
      anonymous union are an extension [-Wnested-anon-types]
        struct { // little-endian of x86 is not nice here.
        ^
Enclave/../Enclave/gbc/types.h:99:9: warning: anonymous types declared in an
      anonymous union are an extension [-Wnested-anon-types]
        struct __attribute__((packed)) {
        ^
In file included from Enclave/Enclave.cpp:1:
In file included from Enclave/Enclave_t.h:12:
Enclave/../Enclave/sgx_includes.h:248:15: warning: zero size arrays are an
      extension [-Wzero-length-array]
    char data[0] __attribute__ ((aligned (__alignof__ (long double))));
              ^
Enclave/Enclave.cpp:57:34: warning: implicit conversion changes signedness:
      'int' to 'size_t' (aka 'unsigned long') [-Wsign-conversion]
    argv = (char **) calloc(argc + 5, sizeof(char **));
                     ~~~~~~ ~~~~~^~~
Enclave/Enclave.cpp:90:10: error: assigning to 'struct player_input *' from
      incompatible type 'void *'
    ap = malloc(sizeof(struct player_input));
         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Enclave/Enclave.cpp:92:9: error: assigning to 'uint16_t *'
      (aka 'unsigned short *') from incompatible type 'void *'
    b = malloc(23040 * 2);
        ^~~~~~~~~~~~~~~~~
Enclave/Enclave.cpp:161:5: error: no matching function for call to 'disassemble'
    disassemble(s);
    ^~~~~~~~~~~
Enclave/gbc/disassembler.h:10:6: note: candidate function not viable: cannot
      convert argument of incomplete type 'void *' to 'struct gb_state *' for
      1st argument
void disassemble(struct gb_state* state);
     ^
Enclave/Enclave.cpp:167:5: error: no matching function for call to
      'audio_update'
    audio_update(s);
    ^~~~~~~~~~~~
Enclave/gbc/audio.h:14:6: note: candidate function not viable: cannot convert
      argument of incomplete type 'void *' to 'struct gb_state *' for 1st
      argument
void audio_update(struct gb_state *s);
     ^
6 warnings and 4 errors generated.

```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJztW1lv27gW_jXKCyFDkhdZD3loEqc3QNEOZlr0vhm0RNucypQvSTlJf_09h5StJYotL8m0wBiqQ1Ncv7MfsrMseb5eOMENPOQxkz8UeWRp6nh3jvfBGXn2mVG1tFXbpu58zeSKK8U3jLir0YC4X_qEuN9pmsI3F1y7iqVzKEumcylc_byGlt9F5q4zLjSTLpVcL7FLkkimFJQU-1_ORMxsE6iYZ3JFcaQ4h8bPUGPmFAuXizjNE-YmXGLPXCRsTorxqWRCL5li-CamSrs05QuBPzKxYVLxTNi2wt1wqXOauonOJHGVTpz-XWw36ft2vEeYmsErCfPCiCKDVjA9YLDhis94CiuDXkueJEwgMhw2Oleaxj_ctcw0i83YDxNYMkW4HpzgPltr-FaLJ5X8gEKxnX3voJTyWfz0dKCRxlakXGcrxWJSrAY6FKVevF4TN2t5kcFoa5ZQoXls2eBBkDlPGSlmTchcZiuyb1VQNWXJgsmx7C2d_ofByAlu7WCk-TGDvVjGVJuO4bH9cF_Qz4d_BVsfWCZwkrJrjOCrP4Yv8kilAPJj8eGvL-S2ADXJgMdEponBVhNBVwDGBjibJjwmKxrLTBFneON-31a6ttIZ3u12MYiIE94CfH2YmgtG_vr43-m3mz8f7j5OnGBMtZawaTLH0bFA5UL1ej0niAi-sy9MbRUYHLLTxxlOnNA8e2j7Gjn84Gx6lC1wT_flTyRGsQpLkGCAxPCHeygCGmPGE0V-Mpm5iv9EXCR9Js4kcMaeE40Tqun2R2RJs-PtkiYw0w7AeEklMd2GNx60IdMpws5nuWbTKZBtjERCDQNgQRFe449sbl-mmVgAo-SzFPYUlU__Zj-1kCynEGTwpgJitAu-0gmU7Iz9PnyP-g2qsCctaYk77vcg7DCUQWL69dPDze30bvLHn5PbD18nd9P7b59vvz58-TwFRNE24KdodXs3uf00RcGQVCT4d5PxpAvEx352JDkaoQEi1NQkpyE06IAQAtCKkNpClAtlGPYtYDoTKxTvUXARrIbnYMWeuMa_wG5vgNLp-IwuJ22jc_CZTt4UoDMQCtFPuAxCYQeEjIFwgg8tGC2YZmKDJXA9lSbbpm8mdmciN74ccuNzNLl6Vpqt_jHcOprcwnL2j7ScGEgYvMfIqIDj-XCTsWXUVrZ8ia6WMTWiW-L6DkiXbHkSWOPLgTU-Eqz1828Glh8gUOFFrGjgHaMD2_BL8vU7i_KRGrCCm7-Vy_Nx882ODsKzbrAXRDv6JVxKxm_PZcfpvWFLCIcx2zwXsQ3YfPRVmm5vwqCxpBqzMNm8RBWjtakmc5NvKRyPQtrsq3rp_uHTpGCjHS0AsnnKY63II-aWZjlPtctFbcrdfCYw2_rB6MSUU1voKwt40fbVyl2nqMEiZjFcuJW1uCuuVlTHy6py8q1T1oYG8sEsn8-ZLKEwfyo_Yek7eLD9fL-LXwb_4SlZgIITxkdZwFxwcDoMgwy9S4kbGXqluCExW_x5QL5ND7XV2PzKL6DUq2D5WzN4PlhWN-3HqlVp_zZgBZcDK-gAFvutwUIXdjy4CFg2g1P18FsBaw2KSiNYvPplfKsqWIiT7_kXQctmcxrQvMZLLdj8HoihpzBupm1PA8ymdA5y12u66x8A6zWjSdDGgqtU90qMnWcxTdOp0lQCyGO2yqcmu1_xKVpcr_rokbf1v6qYc7GhKUxQOQizRzfV6RGVHSV0Vr5cp_SZySkX61zXGiG5KudLVYJF3g5QuiZO_46sYG8ZcIhx-LI5FrTMY03qwx9KkjfdFnhe-jIXefbzBlQdaLHFdD-9grajjfPolYN8-KNpg1bhDf1RkTu1zKRuuLFlcye820vdYLfhWZ24Qd8beEbUgv2EPIWO-w9ODhGkEz0OSmfCFVWKrcy5zrjF7T8oov4IbYjf9H7Po_lihnoDQ4ZO8glr2CFU35Hqphl3ym5Pk4MSUifJcbFHELYAvTAmqLIhe-rso1I0Bwx4asvwLyF4WYED4j8BfzxFzVcMzIpfi00N3ev4VIGuUn0Xx1nF19KzUHeVAUhR6GSKTlFhwxb5OZnzaZ7wbJqvE6pPZ32kmt90z9-Z9cPSNNW31JH3uzB_F-4_i_1Hr7K_2dT2UBj4fnQi3zfAOcj4g5Lxm7jWOd_ktapQN-4d2Z-wKbG9dyTZGqwVYLKi4pkwKTOpytzDy_tK6IcqCd8zLuC7MpQ7_vcS07-XmLrLWXk94rj7GOGBfoduIzUuTV3oElP7RSXgOULJx8_fqgoLwjQmDLftvcd04dtLBz4nntSdSsQ2g9a4rGRVLioIi3vUL_pVYacgrc-rLFfENCzy0sbrhnfV_ZctIY4G7A1pRJMYgilQhi42Nrqpdq3MfAqNC05_vX4HYPcNjX6xDaHowENAdemUuUwknJoThafxiHB7L0_wmJElk6x39vajX2n7tSto9gbaGlS1vc8TRHvo_T4C4weHJabr9T68ykfKq3yFmhJ7dJS5_JcysdBL1_Spwfgu9_n2MFrjEA0NRL-ZeuWrdcpjrqueMKxbLIDJbKAOrFJ6PsVcQWii99B4xUG4PSsLcdkm5g_CXZyP24DfhlkQM6x2y9lqiIFy3pjovnKSab0_Em_jfWgTE7TRw-1hlEnt1Ju_jtMWrhehy4uqYacgxqa_zG0B4yUaaVW4SfR2C3xepp3sUkPD3NVlAp9mqzXVHKhuZB37b4_kEMYSq3OTXKT1UO6NnsMpqWgvhNsM0wsYSBvP2VRT0RSYx6iQ7tAek2E6DcQO6ZphDQ-REXOAi4jsYmZw-I1cFBjVgv_Kdg6kWzpmwbrlPGqhX0zBVGJEVi4ZbeWGU1yKbQAVVTitYtBlmAhm1hIuZbqVbHUZq0Z8Rr4AvsrwviqHtvXnpE0O6lybfTiOkg1FWw9sq_J_IJPQiS27hPOnkHRLx5pncjmSIh3bhq6Q9MiEQJ2eo62JBB9AJGRQJADIggkmoXvSa00jXCXX_STqR_RKc_AUrx-Xz6SaVEDjLlk9uARngLT8v6j-Pfk8mdyR_0w-_eEEPjxXuUyvl1qvjTU2HumC62U-6wGUGO6mm-0fDKT_hkAagzWlcvDugvvhwA-8q-V1NAdtFkYBnVPfj2gY9fvxnPb9JEiiKBzOrlI6Y6m6BlvtBIFgj8QMAWWw1Ff8OvACfMZ-OPCGXi-CIvVH89lsGEdDb-YMPLaiPO3hOnqZXFzJa7OkWQ5x18BLudKqfGnVPGNmOhif5hpU9_Xfq7X3FMaed2UmvzaL_z9dQidu">