I have had a look at <complex> and <cmath>.
It seems that <complex> has a lot of code that applies only during constant evaluation. So in your case, operator* calls std::__constexpr_isinf (and isnan, isfinite etc).
Looking at the implementations of those, starting around line 570 of <math>, there are variations depending on whether the type is_floating_point and whether a builtin is available. Eventually, it calls either __builtin_isinf(), isinf(), or std::isinf(). Notably this is inside namespace std { .... }; so is there a difference between calling isinf() and calling std::isinf()?
For extra excitement, earlier in the file there is using ::isinf, i.e. isinf() from the global namespace is being imported into std::.
Answering my question in the previous post, your definition of your isinf is in your own namespace, not global. So... when __constexpr_isinf calls std::isinf, which it does for non-floating-point types, it won't find yours - though it would have found it if you had defined it in the global namespace.
I've spent a while on this now and I have other things to do. I think if I were you, I'd now try to create a minimal example of the problem.