The system_error header incorrectly provides the specialisation: template<> struct is_error_code_enum<errc> : public true_type { };
Only is_error_condition_enum<errc> should be specialised. The spurious specialisation causes the following code to fail to compile: #include <system_error> int main() { std::error_code ec; if (ec == std::errc::not_supported) ; } with error: a.cpp: In function âint main()â: a.cpp:6: error: ambiguous overload for âoperator==â in âec == (std::errc)95â /usr/include/c++/4.4/system_error:279: note: candidates are: bool std::operator==(const std::error_code&, const std::error_condition&) /usr/include/c++/4.4/system_error:274: note: bool std::operator==(const std::error_code&, const std::error_code&) Expected result: code should compile without warning or error. -- Summary: Specialisation is_error_code_enum<errc> should not exist Product: gcc Version: 4.4.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: libstdc++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: chris_kohlhoff at internet-mail dot org http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39880