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

    <tr>
        <th>Summary</th>
        <td>
            Atomic qualification is not removed from cast expressions, function calls, and enumeration underlying types
        </td>
    </tr>

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

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

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

<pre>
    C23 includes the following text that removes atomic qualification in the following contexts:
>Preceding an expression by a parenthesized type name converts the value of the expression to the
unqualified, non-atomic version of the named type. This construction is called a cast.

Section 6.5.5 "Cast operators" Paragraph 6 N3220
>If an enum type specifier is present, then the longest possible sequence of tokens that can be
interpreted as a specifier qualifier list is interpreted as part of the enum type specifier. It shall name
an integer type that is neither an enumeration nor a bit-precise integer type. The underlying type of
the enumeration is the unqualified, non-atomic version of the type specified by the type specifiers in
the specifier qualifier list.

Section 6.7.3.3 "Enumeration specifiers" Paragraph 5 N3220
>If, in the declaration "T D1", D1 has the form
>
>D ( parameter-type-list opt ) attribute-specifier-sequence opt
>
>and the type specified for ident in the declaration "T D" is "derived-declarator-type-list T", then the
type specified for ident is "derived-declarator-type-list function returning the unqualified, non-atomic
version of T". The optional attribute specifier sequence appertains to the function type.

Section 6.7.7.4 "Function declarators" Paragraph 4 N3220

Clang does not remove atomic qualifiers in these cases, here are some examples:
```c
puts(_Generic((_Atomic int)0,int:"A",_Atomic int:"B"));
```
This should output A, Clang outputs B.
```c
enum E:_Atomic int;
```
This should be valid, Clang rejects it.
```c
puts(_Generic(((_Atomic int(*)())0)(),int:"A",_Atomic int:"B"));
```
This should output A, Clang outputs B.

The case described in #96713 also has the same problem (along with the other qualifiers). Clang does remove atomic qualification in lvalue conversion since this was included in C17. GCC removes atomic qualification in all cases even in C17 mode, except for directly removing them from the function return type which is instead done when calling the function. Clang also fails to remove any qualifiers from function return types, which was reported before #39494.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzEVsGS4jgS_RpxycBhZAz4wIGiunr7stER2_cN2Upj7cqSW5KpZr5-IiUbKKpqem4TRVBYljJfvnx6kvBenQzinpVPrHxeiDF01u3_JTT9jRfRCqWLRW3lZX_kBSjT6FGih9AhtFZr-6rMCQL-ChA6EcBhb8_oQQTbqwZ-jkKrVjUiKGtAmYd1jTW01LPiwPJnlh9Y8eW7wwYlvRUG8Nfg0HtaXF9AwCAcmtChV3-ghHAZEIzokQKd0YWE6yz0iGDb-HAXIVgaSYlGM0FDyfgRjDXLCfIZXZw9rafwKVMGPzrlKZUPbmxSRR4aoTVKENAIH7KpjPj9H0yTNlmZlcA4PwofwA7oRLDOM87hu3Di5MTQwQb-XXCeX2n41sb6zdinMv2ADcF1lJNKQhMIeegwsaqtOaEPMFjvVa0RPP4c0TSJCft_ND61qBEG6okGZQK6wWGgCjyIuzQzPw608oGyPkwehAtXlt_jzOBbAN8JrSOHKZ8wMcoJXZodASkPBlXo0M0lE0PEnLEOBNQqLAeHjfL4ZjU1BGE0Ep2-RBlSSNumVDOsOZZK4vjbjX9TjST5vRt1xMkt22fcfSKKbVZkBcniyx3KW-i38ijfyYPQTxtKYqPFFIBx_gOeV4xzmvC8gk7Mu9X11-XXH8_A-I5aKXoM6JZU3zI23A4BGK9AhOBUPQZcXrEtb9IawvuYwsiPGGytAyXRhM9hU83K04NEp84ol_Mcew_tx1TdrP2pBZ-m-33EdjSpLQ7D6EwU01-JJWW8UwxBSnq0AwUS-kbcnTCuxIlhQBeEok1pU39mCFHan0lmm62pmJd58q2aB8Gs3wgmfh-1MCeQFj0YO1v1g1MnTRMgj-Ro6KnwDh2CcAje9mSpoh803rn2Jk-fiZdhDJ7x3X-_okGnGsZ39HRIiRT5VpUzfqRfxYFxfkj9vJ8Rx5_ieEWf4ukhVXqMjuw7O2oJdgzDGOBAgFOpacTDU_YxzuhaX1hxeJP595nqeMYoecvk8H_YBA8qfJLqQ0oeWdkxoqKKP6pE0vXhH2BrWpN0ABJ941SNkvTBeFFttqsChPb2ajGejuLB2VpjT74i6EyCVxW6-NpGi78JjfEqgztRfijI29VBp3M9HfVx33lFWylQVa_Cz5eTCPC42mbw9Xj87YWEzqeoc8Azmmkp9FYiMYO_GhxC9BKpHDZBX1LEySF6aJ3t3-7fZCHJ_V471XTp7PQBhQRpDY2iifeG2WfmtTMdkVW6ekV3mHkxl_tdGhN_lDTu2JSYWHE4WEdHdo2tdUitK6p1tc4Wcl_IqqjEAver7aoqNnlZlotuXxZyXYsVX5V12ZblbrsqEXd12-xa0VYoFmrPc77ON3yT53m1KrNqhXVZNtVu3azrfLVl6xx7oXSm9bnPrDstlPcj7kkz24UWNWofr5ycG3yF-JLUWz4v3J7WLOvx5Nk6J3P2tyhBBY37w4etvDc1mdihG9ndBTASc2WM-I8jdFzdXxQeLhR-MTq970IYouHxF8ZfTip0Y501tmf8hdBN_5aDs2QEjL_EmjzjL6nm857_GQAA__-BWc_P">