Author: d0k
Date: Thu Sep 20 09:07:17 2012
New Revision: 164303

URL: http://llvm.org/viewvc/llvm-project?rev=164303&view=rev
Log:
StmtPrinter: Print floating point literals with the right suffix to 
disambiguate them from integers.

Based on a patch by Olaf Krzikalla, UDL fixes by me.

Modified:
    cfe/trunk/lib/AST/StmtPrinter.cpp
    cfe/trunk/test/Rewriter/objc-modern-boxing.mm
    cfe/trunk/test/Rewriter/objc-modern-numeric-literal.mm

Modified: cfe/trunk/lib/AST/StmtPrinter.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/StmtPrinter.cpp?rev=164303&r1=164302&r2=164303&view=diff
==============================================================================
--- cfe/trunk/lib/AST/StmtPrinter.cpp (original)
+++ cfe/trunk/lib/AST/StmtPrinter.cpp Thu Sep 20 09:07:17 2012
@@ -734,10 +734,30 @@
   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) {
@@ -1217,7 +1237,12 @@
     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());

Modified: cfe/trunk/test/Rewriter/objc-modern-boxing.mm
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Rewriter/objc-modern-boxing.mm?rev=164303&r1=164302&r2=164303&view=diff
==============================================================================
--- cfe/trunk/test/Rewriter/objc-modern-boxing.mm (original)
+++ cfe/trunk/test/Rewriter/objc-modern-boxing.mm Thu Sep 20 09:07:17 2012
@@ -66,7 +66,7 @@
 // CHECK:  NSNumber *fortyTwoUnsigned = ((NSNumber *(*)(id, SEL, unsigned 
int))(void *)objc_msgSend)(objc_getClass("NSNumber"), 
sel_registerName("numberWithUnsignedInt:"), (42U));
 // CHECK:  NSNumber *fortyTwoLong = ((NSNumber *(*)(id, SEL, long))(void 
*)objc_msgSend)(objc_getClass("NSNumber"), sel_registerName("numberWithLong:"), 
(42L));
 // CHECK:  NSNumber *fortyTwoLongLong = ((NSNumber *(*)(id, SEL, long 
long))(void *)objc_msgSend)(objc_getClass("NSNumber"), 
sel_registerName("numberWithLongLong:"), (42LL));
-// CHECK:  NSNumber *piFloat = ((NSNumber *(*)(id, SEL, float))(void 
*)objc_msgSend)(objc_getClass("NSNumber"), 
sel_registerName("numberWithFloat:"), (3.1415927));
+// CHECK:  NSNumber *piFloat = ((NSNumber *(*)(id, SEL, float))(void 
*)objc_msgSend)(objc_getClass("NSNumber"), 
sel_registerName("numberWithFloat:"), (3.1415927F));
 // CHECK:  NSNumber *piDouble = ((NSNumber *(*)(id, SEL, double))(void 
*)objc_msgSend)(objc_getClass("NSNumber"), 
sel_registerName("numberWithDouble:"), (3.1415926535));
 // CHECK:  NSNumber *nsb = ((NSNumber *(*)(id, SEL, BOOL))(void 
*)objc_msgSend)(objc_getClass("NSNumber"), sel_registerName("numberWithBool:"), 
(BOOL)(b));
 // CHECK:  NSString *duplicateString = ((NSString *(*)(id, SEL, const char 
*))(void *)objc_msgSend)(objc_getClass("NSString"), 
sel_registerName("stringWithUTF8String:"), (const char *)(strdup("Hello")));

Modified: cfe/trunk/test/Rewriter/objc-modern-numeric-literal.mm
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Rewriter/objc-modern-numeric-literal.mm?rev=164303&r1=164302&r2=164303&view=diff
==============================================================================
--- cfe/trunk/test/Rewriter/objc-modern-numeric-literal.mm (original)
+++ cfe/trunk/test/Rewriter/objc-modern-numeric-literal.mm Thu Sep 20 09:07:17 
2012
@@ -61,7 +61,7 @@
 // CHECK:  NSNumber *fortyTwoUnsigned = ((NSNumber *(*)(id, SEL, unsigned 
int))(void *)objc_msgSend)(objc_getClass("NSNumber"), 
sel_registerName("numberWithUnsignedInt:"), 42U);
 // CHECK:  NSNumber *fortyTwoLong = ((NSNumber *(*)(id, SEL, long))(void 
*)objc_msgSend)(objc_getClass("NSNumber"), sel_registerName("numberWithLong:"), 
42L);
 // CHECK:  NSNumber *fortyTwoLongLong = ((NSNumber *(*)(id, SEL, long 
long))(void *)objc_msgSend)(objc_getClass("NSNumber"), 
sel_registerName("numberWithLongLong:"), 42LL);
-// CHECK:  NSNumber *piFloat = ((NSNumber *(*)(id, SEL, float))(void 
*)objc_msgSend)(objc_getClass("NSNumber"), 
sel_registerName("numberWithFloat:"), 3.1415927);
+// CHECK:  NSNumber *piFloat = ((NSNumber *(*)(id, SEL, float))(void 
*)objc_msgSend)(objc_getClass("NSNumber"), 
sel_registerName("numberWithFloat:"), 3.1415927F);
 // CHECK:  NSNumber *piDouble = ((NSNumber *(*)(id, SEL, double))(void 
*)objc_msgSend)(objc_getClass("NSNumber"), 
sel_registerName("numberWithDouble:"), 3.1415926535);
 // CHECK:  NSNumber *yesNumber = ((NSNumber *(*)(id, SEL, BOOL))(void 
*)objc_msgSend)(objc_getClass("NSNumber"), sel_registerName("numberWithBool:"), 
true);
 // CHECK:  NSNumber *noNumber = ((NSNumber *(*)(id, SEL, BOOL))(void 
*)objc_msgSend)(objc_getClass("NSNumber"), sel_registerName("numberWithBool:"), 
false);


_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to