one would assume that `getCanonicalTypeUnqualified` returns an unqualified type, but sadly one would be wrong. the current logic fails for std::optional as implemented in libcxx, because Star and Arrow types mismatch in their const qualification. there are other places in clang that use getCanonicalTypeUnqualified().getUnqualifiedType().