CanQualType for ssize_t

Hi,
I have a question regarding the right way to get CanQualType/QualType for “ssize_t”.

The class ASTContext (https://clang.llvm.org/doxygen/ASTContext_8cpp_source.html#l04524)
has a number of methods: getIntMaxType, getUintMaxType, getSizeType etc but if i am not mistaken it doesn’t have the counterpart for “ssize_t”.
After looking at the implementation of those methods i see that it’s missing in the class TargetInfo either. https://clang.llvm.org/doxygen/include_2clang_2Basic_2TargetInfo_8h_source.html#l00228 .

Some context:

in PrintfSpecifier::getArgType (in ./lib/Analysis/PrintfFormatString.cpp)
there is a FIXME:

case LengthModifier::AsSizeT:
return ArgType(); // FIXME: ssize_t

as a result Clang doesn’t analyze the format string “%zd” correctly
and doesn’t warn on the following (broken) code:

int main() {
printf(“%zd”, 12.2);
return 0;
}

Kind regards,
Alexander Shaposhnikov

The C11 standard has the following paragraph for ‘z’:

Specifies that a following d, i, o, u, x, or X conversion specifier applies to a size_t or the corresponding signed integer type argument; or that a following n conversion specifier applies to a pointer to a signed integer type corresponding to size_t argument.

If I interpret it correctly (please correct me if I’m wrong) then this means that for ‘%zd’ you can use a type that identical to the target’s SizeType, except that it has to be signed.

Alex

Yeah, I think you are right,
my question was mostly about if it’s on purpose that TargetInfo and ASTContext don’t expose this information (like they do for size_t).
I mean that there is getSizeType method, but there isn’t getSignedSizeType and I’m wondering if it’s expected.
If it’s not on purpose - what would people say to adding it ? or what we should use instead.
Many thanks for the reply,
Kind regards,
Alexander Shaposhnikov

Yeah, I think you are right,
my question was mostly about if it's on purpose that TargetInfo
<https://clang.llvm.org/doxygen/classclang_1_1TargetInfo.html&gt; and
ASTContext don't expose this information (like they do for size_t).

I mean that there is getSizeType method, but there isn't getSignedSizeType

and I'm wondering if it's expected.
If it's not on purpose - what would people say to adding it ? or what we
should use instead.
Many thanks for the reply,
Kind regards,
Alexander Shaposhnikov

I think that the standard says that we can just take the signed version of
the SizeType. A method like this in TargetInfo should suffice then:

IntType getSignedSizeType() const {
  switch (SizeType) {
  case UnsignedLongLong: return SignedLongLong;
  ....
  }
}

Then you should be able to add an appropriate method to the ASTContext that
returns a QualType that corresponds to this Target type.

In my opinion this is a reasonable solution to the problem,
Alex

Sounds good, thanks!
Kind regards,
Alexander Shaposhnikov