diff options
Diffstat (limited to 'contrib/llvm/tools/clang/lib/AST/StmtPrinter.cpp')
| -rw-r--r-- | contrib/llvm/tools/clang/lib/AST/StmtPrinter.cpp | 68 | 
1 files changed, 56 insertions, 12 deletions
diff --git a/contrib/llvm/tools/clang/lib/AST/StmtPrinter.cpp b/contrib/llvm/tools/clang/lib/AST/StmtPrinter.cpp index c0960ce6a244..57eb1a95181c 100644 --- a/contrib/llvm/tools/clang/lib/AST/StmtPrinter.cpp +++ b/contrib/llvm/tools/clang/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());  }  | 
