diff options
author | dim <dim@FreeBSD.org> | 2012-12-02 13:20:44 +0000 |
---|---|---|
committer | dim <dim@FreeBSD.org> | 2012-12-02 13:20:44 +0000 |
commit | 056abd2059c65a3e908193aeae16fad98017437c (patch) | |
tree | 2732d02d7d51218d6eed98ac7fcfc5b8794896b5 /lib/AST/StmtPrinter.cpp | |
parent | cc73504950eb7b5dff2dded9bedd67bc36d64641 (diff) | |
download | FreeBSD-src-056abd2059c65a3e908193aeae16fad98017437c.zip FreeBSD-src-056abd2059c65a3e908193aeae16fad98017437c.tar.gz |
Vendor import of clang release_32 branch r168974 (effectively, 3.2 RC2):
http://llvm.org/svn/llvm-project/cfe/branches/release_32@168974
Diffstat (limited to 'lib/AST/StmtPrinter.cpp')
-rw-r--r-- | lib/AST/StmtPrinter.cpp | 68 |
1 files changed, 56 insertions, 12 deletions
diff --git a/lib/AST/StmtPrinter.cpp b/lib/AST/StmtPrinter.cpp index c0960ce..57eb1a9 100644 --- a/lib/AST/StmtPrinter.cpp +++ b/lib/AST/StmtPrinter.cpp @@ -61,7 +61,7 @@ namespace { void PrintRawCompoundStmt(CompoundStmt *S); void PrintRawDecl(Decl *D); - void PrintRawDeclStmt(DeclStmt *S); + void PrintRawDeclStmt(const DeclStmt *S); void PrintRawIfStmt(IfStmt *If); void PrintRawCXXCatchStmt(CXXCatchStmt *Catch); void PrintCallArgs(CallExpr *E); @@ -121,8 +121,8 @@ void StmtPrinter::PrintRawDecl(Decl *D) { D->print(OS, Policy, IndentLevel); } -void StmtPrinter::PrintRawDeclStmt(DeclStmt *S) { - DeclStmt::decl_iterator Begin = S->decl_begin(), End = S->decl_end(); +void StmtPrinter::PrintRawDeclStmt(const DeclStmt *S) { + DeclStmt::const_decl_iterator Begin = S->decl_begin(), End = S->decl_end(); SmallVector<Decl*, 2> Decls; for ( ; Begin != End; ++Begin) Decls.push_back(*Begin); @@ -187,7 +187,10 @@ void StmtPrinter::VisitAttributedStmt(AttributedStmt *Node) { void StmtPrinter::PrintRawIfStmt(IfStmt *If) { OS << "if ("; - PrintExpr(If->getCond()); + if (const DeclStmt *DS = If->getConditionVariableDeclStmt()) + PrintRawDeclStmt(DS); + else + PrintExpr(If->getCond()); OS << ')'; if (CompoundStmt *CS = dyn_cast<CompoundStmt>(If->getThen())) { @@ -224,7 +227,10 @@ void StmtPrinter::VisitIfStmt(IfStmt *If) { void StmtPrinter::VisitSwitchStmt(SwitchStmt *Node) { Indent() << "switch ("; - PrintExpr(Node->getCond()); + if (const DeclStmt *DS = Node->getConditionVariableDeclStmt()) + PrintRawDeclStmt(DS); + else + PrintExpr(Node->getCond()); OS << ")"; // Pretty print compoundstmt bodies (very common). @@ -240,7 +246,10 @@ void StmtPrinter::VisitSwitchStmt(SwitchStmt *Node) { void StmtPrinter::VisitWhileStmt(WhileStmt *Node) { Indent() << "while ("; - PrintExpr(Node->getCond()); + if (const DeclStmt *DS = Node->getConditionVariableDeclStmt()) + PrintRawDeclStmt(DS); + else + PrintExpr(Node->getCond()); OS << ")\n"; PrintStmt(Node->getBody()); } @@ -366,7 +375,7 @@ void StmtPrinter::VisitReturnStmt(ReturnStmt *Node) { } -void StmtPrinter::VisitAsmStmt(AsmStmt *Node) { +void StmtPrinter::VisitGCCAsmStmt(GCCAsmStmt *Node) { Indent() << "asm "; if (Node->isVolatile()) @@ -422,7 +431,7 @@ void StmtPrinter::VisitAsmStmt(AsmStmt *Node) { if (i != 0) OS << ", "; - VisitStringLiteral(Node->getClobber(i)); + VisitStringLiteral(Node->getClobberStringLiteral(i)); } OS << ");\n"; @@ -734,10 +743,30 @@ void StmtPrinter::VisitIntegerLiteral(IntegerLiteral *Node) { case BuiltinType::UInt128: OS << "Ui128"; break; } } -void StmtPrinter::VisitFloatingLiteral(FloatingLiteral *Node) { + +static void PrintFloatingLiteral(raw_ostream &OS, FloatingLiteral *Node, + bool PrintSuffix) { SmallString<16> Str; Node->getValue().toString(Str); OS << Str; + if (Str.find_first_not_of("-0123456789") == StringRef::npos) + OS << '.'; // Trailing dot in order to separate from ints. + + if (!PrintSuffix) + return; + + // Emit suffixes. Float literals are always a builtin float type. + switch (Node->getType()->getAs<BuiltinType>()->getKind()) { + default: llvm_unreachable("Unexpected type for float literal!"); + case BuiltinType::Half: break; // FIXME: suffix? + case BuiltinType::Double: break; // no suffix. + case BuiltinType::Float: OS << 'F'; break; + case BuiltinType::LongDouble: OS << 'L'; break; + } +} + +void StmtPrinter::VisitFloatingLiteral(FloatingLiteral *Node) { + PrintFloatingLiteral(OS, Node, /*PrintSuffix=*/true); } void StmtPrinter::VisitImaginaryLiteral(ImaginaryLiteral *Node) { @@ -907,7 +936,7 @@ void StmtPrinter::VisitExtVectorElementExpr(ExtVectorElementExpr *Node) { OS << Node->getAccessor().getName(); } void StmtPrinter::VisitCStyleCastExpr(CStyleCastExpr *Node) { - OS << "(" << Node->getType().getAsString(Policy) << ")"; + OS << "(" << Node->getTypeAsWritten().getAsString(Policy) << ")"; PrintExpr(Node->getSubExpr()); } void StmtPrinter::VisitCompoundLiteralExpr(CompoundLiteralExpr *Node) { @@ -1110,6 +1139,8 @@ void StmtPrinter::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *Node) { PrintExpr(Node->getArg(0)); OS << ' ' << OpStrings[Kind]; } + } else if (Kind == OO_Arrow) { + PrintExpr(Node->getArg(0)); } else if (Kind == OO_Call) { PrintExpr(Node->getArg(0)); OS << '('; @@ -1217,7 +1248,12 @@ void StmtPrinter::VisitUserDefinedLiteral(UserDefinedLiteral *Node) { OS << Int->getValue().toString(10, /*isSigned*/false); break; } - case UserDefinedLiteral::LOK_Floating: + case UserDefinedLiteral::LOK_Floating: { + // Print floating literal without suffix. + FloatingLiteral *Float = cast<FloatingLiteral>(Node->getCookedLiteral()); + PrintFloatingLiteral(OS, Float, /*PrintSuffix=*/false); + break; + } case UserDefinedLiteral::LOK_String: case UserDefinedLiteral::LOK_Character: PrintExpr(Node->getCookedLiteral()); @@ -1379,10 +1415,12 @@ void StmtPrinter::VisitCXXNewExpr(CXXNewExpr *E) { OS << "::"; OS << "new "; unsigned NumPlace = E->getNumPlacementArgs(); - if (NumPlace > 0) { + if (NumPlace > 0 && !isa<CXXDefaultArgExpr>(E->getPlacementArg(0))) { OS << "("; PrintExpr(E->getPlacementArg(0)); for (unsigned i = 1; i < NumPlace; ++i) { + if (isa<CXXDefaultArgExpr>(E->getPlacementArg(i))) + break; OS << ", "; PrintExpr(E->getPlacementArg(i)); } @@ -1429,6 +1467,7 @@ void StmtPrinter::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) { OS << '.'; if (E->getQualifier()) E->getQualifier()->print(OS, Policy); + OS << "~"; std::string TypeS; if (IdentifierInfo *II = E->getDestroyedTypeIdentifier()) @@ -1531,6 +1570,7 @@ static const char *getTypeTraitName(UnaryTypeTrait UTT) { case UTT_IsFunction: return "__is_function"; case UTT_IsFundamental: return "__is_fundamental"; case UTT_IsIntegral: return "__is_integral"; + case UTT_IsInterfaceClass: return "__is_interface_class"; case UTT_IsLiteral: return "__is_literal"; case UTT_IsLvalueReference: return "__is_lvalue_reference"; case UTT_IsMemberFunctionPointer: return "__is_member_function_pointer"; @@ -1647,6 +1687,10 @@ void StmtPrinter::VisitSubstNonTypeTemplateParmExpr( Visit(Node->getReplacement()); } +void StmtPrinter::VisitFunctionParmPackExpr(FunctionParmPackExpr *E) { + OS << *E->getParameterPack(); +} + void StmtPrinter::VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *Node){ PrintExpr(Node->GetTemporaryExpr()); } |