If I remove the inheritance, GCC trunk figures it out at -O2 or above (Clang doesn't figure it out). If I add the inheritance back in, GCC doesn't manage either.
Clang does figure it out. Note that clang has a branch, not a loop. It jumps to returning 0, else it continues to do the same thing gcc does.
I'd say it figured it out, even if the code isn't as pretty.
I tried using `final` to get them to figure out the inheritance case, but devirtualization didn't work when inlining a method defined on a base class.
https://godbolt.org/z/h4GEYnzMo
You're right, I should have read the Clang output more closely. The part about final inheritance makes sense, too, because otherwise a subclass could override the behaviour and count_concept() would have to support that.
https://godbolt.org/z/7bTETsdd1