https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91292
--- Comment #4 from Patrick Palka <ppalka at gcc dot gnu.org> --- And if -(1) is to be mangled the same as -1, then shouldn't template<typename T> typename std::enable_if<(int)sizeof(T) >= -(1), int>::type size1(T *t); template<typename T> typename std::enable_if<(int)sizeof(T) >= -1, int>::type size1(T *t); be considered two declarations of the same function? But IIUC that would contradict [temp.over.link]p5, which says Two expressions involving template parameters are considered equivalent if two function definitions containing the expressions would satisfy the one-definition rule but IIUC the one-definition rule fails here because -1 is not the same (token-wise) as -(1).