MarcusJohnson91 updated this revision to Diff 361409.
MarcusJohnson91 marked an inline comment as done.
MarcusJohnson91 added a comment.

#1: Moved a comment to the top, so it's brettier 😊

#2: Moved all the ugly StringLiteral conversion code to 
StringLiteral::getStrDataAsChar and forwarded that function to 
FormatStringLiteral::getStrDataAsChar


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D103426/new/

https://reviews.llvm.org/D103426

Files:
  clang/lib/AST/OSLog.cpp
  clang/lib/Sema/SemaChecking.cpp
  clang/lib/StaticAnalyzer/Checkers/CheckSecuritySyntaxOnly.cpp

Index: clang/lib/StaticAnalyzer/Checkers/CheckSecuritySyntaxOnly.cpp
===================================================================
--- clang/lib/StaticAnalyzer/Checkers/CheckSecuritySyntaxOnly.cpp
+++ clang/lib/StaticAnalyzer/Checkers/CheckSecuritySyntaxOnly.cpp
@@ -785,28 +785,10 @@
     // Currently we only handle (not wide) string literals. It is possible to do
     // better, either by looking at references to const variables, or by doing
     // real flow analysis.
-    std::string String;
     auto FormatString =
         dyn_cast<StringLiteral>(CE->getArg(ArgIndex)->IgnoreParenImpCasts());
     
-    StringLiteral::StringKind Kind = FormatString->getKind();
-    
-    if (Kind == StringLiteral::Ascii || Kind == StringLiteral::UTF8) {
-      String = FormatString->getStringAsChar();
-    } else if (Kind == StringLiteral::UTF16) {
-      std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> Convert;
-      std::u16string U16 = FormatString->getStringAsChar16();
-      String = Convert.to_bytes(U16);
-    } else if (Kind == StringLiteral::UTF32) {
-      std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> Convert;
-      std::u32string U32 = FormatString->getStringAsChar32();
-      String = Convert.to_bytes(U32);
-    } else if (Kind == StringLiteral::Wide) {
-      std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>, wchar_t> Convert;
-      std::wstring WChar = FormatString->getStringAsWChar();
-      String = Convert.to_bytes(WChar);
-    }
-    
+    std::string String(FormatString->getStrDataAsChar());
     StringRef StrRef = StringRef(String);
     
     if (FormatString &&
Index: clang/lib/Sema/SemaChecking.cpp
===================================================================
--- clang/lib/Sema/SemaChecking.cpp
+++ clang/lib/Sema/SemaChecking.cpp
@@ -622,25 +622,7 @@
     auto *FormatExpr = TheCall->getArg(FormatIndex)->IgnoreParenImpCasts();
 
     if (auto *Format = dyn_cast<StringLiteral>(FormatExpr)) {
-      StringLiteral::StringKind Kind = Format->getKind();
-      std::string String;
-      
-      if (Kind == StringLiteral::Ascii || Kind == StringLiteral::UTF8) {
-        String = Format->getStringAsChar();
-      } else if (Kind == StringLiteral::UTF16) {
-        std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> Convert;
-        std::u16string U16 = Format->getStringAsChar16();
-        String = Convert.to_bytes(U16);
-      } else if (Kind == StringLiteral::UTF32) {
-        std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> Convert;
-        std::u32string U32 = Format->getStringAsChar32();
-        String = Convert.to_bytes(U32);
-      } else if (Kind == StringLiteral::Wide) {
-        std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>, wchar_t> Convert;
-        std::wstring WChar = Format->getStringAsWChar();
-        String = Convert.to_bytes(WChar);
-      }
-      
+      std::string String(Format->getStrDataAsChar());
       StringRef FormatStrRef(String);
       
       EstimateSizeFormatHandler H(FormatStrRef);
@@ -7481,6 +7463,10 @@
     return FExpr->getString().drop_front(Offset);
   }
   
+  const char *getStrDataAsChar() const {
+    return FExpr->getStrDataAsChar();
+  }
+  
   std::string getStringAsChar() const {
     return FExpr->getStringAsChar();
   }
@@ -9538,24 +9524,7 @@
         /*IsStringLocation*/ true, OrigFormatExpr->getSourceRange());
     return;
   }
-  StringLiteral::StringKind Kind = FExpr->getKind();
-  std::string String;
-  
-  if (Kind == StringLiteral::Ascii || Kind == StringLiteral::UTF8) {
-    String = FExpr->getStringAsChar();
-  } else if (Kind == StringLiteral::UTF16) {
-    std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> Convert;
-    std::u16string U16 = FExpr->getStringAsChar16();
-    String = Convert.to_bytes(U16);
-  } else if (Kind == StringLiteral::UTF32) {
-    std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> Convert;
-    std::u32string U32 = FExpr->getStringAsChar32();
-    String = Convert.to_bytes(U32);
-  } else if (Kind == StringLiteral::Wide) {
-    std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>, wchar_t> Convert;
-    std::wstring WChar = FExpr->getStringAsWChar();
-    String = Convert.to_bytes(WChar);
-  }
+  std::string String(FExpr->getStrDataAsChar());
   
   StringRef StrRef(String);
   const char *Str = StrRef.data();
@@ -9626,25 +9595,7 @@
   assert(T && "String literal not of constant array type!");
   size_t TypeSize = T->getSize().getZExtValue();
   
-  StringLiteral::StringKind Kind = FExpr->getKind();
-  std::string String;
-  
-  if (Kind == StringLiteral::Ascii || Kind == StringLiteral::UTF8) {
-    String = FExpr->getStringAsChar();
-  } else if (Kind == StringLiteral::UTF16) {
-    std::u16string  U16 = FExpr->getStringAsChar16();
-    std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> Convert;
-    String = Convert.to_bytes(U16);
-  } else if (Kind == StringLiteral::UTF32) {
-    std::u32string U32 = FExpr->getStringAsChar32();
-    std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> Convert;
-    String = Convert.to_bytes(U32);
-  } else if (Kind == StringLiteral::Wide) {
-    std::wstring WChar = FExpr->getStringAsWChar();
-    std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>, wchar_t> Convert;
-    String = Convert.to_bytes(WChar);
-  }
-  
+  std::string String(FExpr->getStrDataAsChar());
   StringRef StrRef(String);
   const char *Str = StrRef.data();
   
Index: clang/lib/AST/OSLog.cpp
===================================================================
--- clang/lib/AST/OSLog.cpp
+++ clang/lib/AST/OSLog.cpp
@@ -205,23 +205,6 @@
   const StringLiteral *Lit = cast<StringLiteral>(StringArg->IgnoreParenCasts());
   assert(Lit);
   std::string String(Lit->getStrDataAsChar());
-  /*
-  if (Lit->isAscii() || Lit->isUTF8()) {
-    String = Lit->getStringAsChar();
-  } else if (Lit->isUTF16()) {
-    std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> Convert;
-    std::u16string U16 = Lit->getStringAsChar16();
-    String = Convert.to_bytes(U16);
-  } else if (Lit->isUTF32()) {
-    std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> Convert;
-    std::u32string U32 = Lit->getStringAsChar32();
-    String = Convert.to_bytes(U32);
-  } else if (Lit->isWide()) {
-    std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>, wchar_t> Convert;
-    std::wstring WChar = Lit->getStringAsWChar();
-    String = Convert.to_bytes(WChar);
-  }
-  */
   StringRef Data(String);
   
   OSLogFormatStringHandler H(VarArgs);
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to