[cfe-dev] PrettyPrinting statements with type signed/unsigned char
Andrey Tarasevich
tarasevich.andrey at gmail.com
Tue Jun 11 01:51:38 PDT 2013
On Jun 10, 2013, at 10:48 PM, Richard Smith <richard at metafoo.co.uk> wrote:
> On Sun, Jun 9, 2013 at 7:54 AM, Andrey Tarasevich
> <tarasevich.andrey at gmail.com> wrote:
>> Hi,
>>
>> It is indeed only reachable if I try to print a literal. The following code
>> within a ASTConsumer class triggers the error
>>
>> bool TestAstConsumer::HandleTopLevelDecl(clang::DeclGroupRef D)
>> {
>> clang::QualType type = _context->UnsignedCharTy;
>> clang::VarDecl* vd = clang::VarDecl::Create(*_context,
>>
>> _context->getTranslationUnitDecl(),
>> clang::SourceLocation(),
>> clang::SourceLocation(),
>> &_context->Idents.get("var"),
>> type,
>> 0,
>> clang::SC_None);
>> llvm::APInt* val = new llvm::APInt(_context->getIntWidth(type), 10);
>> clang::Expr* init = clang::IntegerLiteral::Create(*_context,
>> *val,
>> type,
>> clang::SourceLocation());
>> vd->setInit(init);
>> clang::DeclGroupRef *dgr = new (_context) clang::DeclGroupRef(vd);
>> clang::DeclStmt *dst = new (_context) clang::DeclStmt(*dgr,
>> clang::SourceLocation(), clang::SourceLocation());
>> dst->printPretty(llvm::outs(), 0, _context->getPrintingPolicy());
>> }
>>
>> and this is the error message I get
>>
>> unsigned char var = 10Unexpected type for integer literal!
>> UNREACHABLE executed at
>> <path_to_llvm_source>/llvm/tools/clang/lib/AST/StmtPrinter.cpp:730!
>
> You have built a malformed AST; there are no IntegerLiterals of
> character types. Maybe build a CharacterLiteral instead
Sorry. I found the problem in my code.
I tried to printPretty following code and it worked fine.
int main()
{
unsigned char a = 10;
}
Eventually clang treats the '10' literal as a IntegerLiteral and not as a CharacterLiteral and prints it as BuiltinType::Int.
It means, that I'm using the IntegerLiteral as a correct class in this case, but the type of the IntegerLiteral is wrong. In my example I should use _context->IntTy and not _context->
UnsignedCharTy when I create the IntegerLiteral itself. Then everything works.
>> On Jun 8, 2013, at 12:32 AM, Richard Smith <richard at metafoo.co.uk> wrote:
>>
>> On Fri, Jun 7, 2013 at 6:39 AM, Andrey Tarasevich
>> <tarasevich.andrey at gmail.com> wrote:
>>
>> Hello,
>>
>> When I'm trying to pretty print statement with type signed or unsigned char
>> I'm getting an error from the StmtPrinter - "Unexpected type for integer
>> literal!". Is this a bug? If yes, then following small patch fixes it. At
>> least in my case it works just fine and statements are printed correctly.
>>
>>
>> Please provide a test case. This should only be reachable if you try
>> to print a *literal* with type SChar or UChar. How are you building
>> such a literal?
>>
>> Cheers,
>> Andrey Tarasevich
>>
>> --- StmtPrinter.cpp 2013-06-07 15:17:31.000000000 +0200
>> +++ StmtPrinter.cpp 2013-06-07 15:24:43.000000000 +0200
>> @@ -731,6 +731,8 @@
>> // FIXME: The Short and UShort cases are to handle cases where a short
>> // integeral literal is formed during template instantiation. They should
>> // be removed when template instantiation no longer needs integer
>> literals.
>> + case BuiltinType::UChar:
>> + case BuiltinType::SChar:
>> case BuiltinType::Short:
>> case BuiltinType::UShort:
>> case BuiltinType::Int: break; // no suffix.
>> _______________________________________________
>> cfe-dev mailing list
>> cfe-dev at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>>
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20130611/2b6c9d32/attachment.html>
More information about the cfe-dev
mailing list