https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118751
Bug ID: 118751 Summary: optional diagnostic not given on invalid bitfield reference in uninstantiated template Product: gcc Version: 14.1.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: matoro_gcc_bugzilla at matoro dot tk Target Milestone: --- Sample comparison: https://godbolt.org/z/3zYfe35jM gcc does not diagnose non-const bitfield references in uninstantiated templates, while clang does. #include <utility> template <typename T> struct s { int m : 5; void swap() { std::swap(m, m); } }; clang: <source>:9:19: error: non-const reference cannot bind to bit-field 'm' 9 | std::swap(m, m); | ^ <source>:6:9: note: bit-field is declared here 6 | int m : 5; | ^ /opt/compiler-explorer/gcc-14.2.0/lib/gcc/x86_64-linux-gnu/14.2.0/../../../../include/c++/14.2.0/bits/move.h:213:15: note: passing argument to parameter '__a' here 213 | swap(_Tp& __a, _Tp& __b) | ^ gcc does correctly diagnose if template is instantiated. This is technically optional so it's not a correctness issue but gcc's lack of even a warning here is giving the impression that clang is doing something wrong.