]> granicus.if.org Git - clang/commitdiff
Revert r145697 and dependent patch r145702. It added a dependency from
authorNick Lewycky <nicholas@mxc.ca>
Fri, 2 Dec 2011 23:21:43 +0000 (23:21 +0000)
committerNick Lewycky <nicholas@mxc.ca>
Fri, 2 Dec 2011 23:21:43 +0000 (23:21 +0000)
lib/Analysis to lib/Sema which is cyclical.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@145724 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Analysis/Analyses/FormatString.h
lib/Analysis/FormatString.cpp
lib/Analysis/PrintfFormatString.cpp
lib/Sema/SemaChecking.cpp
test/Sema/format-strings-int-typedefs.c [deleted file]

index 4385fc3af015b0464de90ad10c9631a74f495269..b2d45e36cb13db8d8b2a6721ecd88277c355e501 100644 (file)
@@ -23,8 +23,6 @@
 
 namespace clang {
 
-class Sema;
-
 //===----------------------------------------------------------------------===//
 /// Common components of both fprintf and fscanf format strings.
 namespace analyze_format_string {
@@ -450,7 +448,7 @@ public:
   /// will return null if the format specifier does not have
   /// a matching data argument or the matching argument matches
   /// more than one type.
-  ArgTypeResult getArgType(Sema &S) const;
+  ArgTypeResult getArgType(ASTContext &Ctx) const;
 
   const OptionalFlag &hasThousandsGrouping() const {
       return HasThousandsGrouping;
index 0171bb7aec34a2c959c10d5324ab4e279b939bd7..6498ded4e374df02b8b10b35ff9fd8eefefc15ed 100644 (file)
@@ -230,8 +230,7 @@ bool ArgTypeResult::matchesType(ASTContext &C, QualType argTy) const {
       
     case SpecificTy: {
       argTy = C.getCanonicalType(argTy).getUnqualifiedType();
-      QualType U = C.getCanonicalType(T);
-      if (U == argTy)
+      if (T == argTy)
         return true;
       // Check for "compatible types".
       if (const BuiltinType *BT = argTy->getAs<BuiltinType>())
@@ -240,26 +239,26 @@ bool ArgTypeResult::matchesType(ASTContext &C, QualType argTy) const {
             break;
           case BuiltinType::Char_S:
           case BuiltinType::SChar:
-            return U == C.UnsignedCharTy;
+            return T == C.UnsignedCharTy;
           case BuiltinType::Char_U:
           case BuiltinType::UChar:                    
-            return U == C.SignedCharTy;
+            return T == C.SignedCharTy;
           case BuiltinType::Short:
-            return U == C.UnsignedShortTy;
+            return T == C.UnsignedShortTy;
           case BuiltinType::UShort:
-            return U == C.ShortTy;
+            return T == C.ShortTy;
           case BuiltinType::Int:
-            return U == C.UnsignedIntTy;
+            return T == C.UnsignedIntTy;
           case BuiltinType::UInt:
-            return U == C.IntTy;
+            return T == C.IntTy;
           case BuiltinType::Long:
-            return U == C.UnsignedLongTy;
+            return T == C.UnsignedLongTy;
           case BuiltinType::ULong:
-            return U == C.LongTy;
+            return T == C.LongTy;
           case BuiltinType::LongLong:
-            return U == C.UnsignedLongLongTy;
+            return T == C.UnsignedLongLongTy;
           case BuiltinType::ULongLong:
-            return U == C.LongLongTy;
+            return T == C.LongLongTy;
         }
       return false;
     }
@@ -486,3 +485,5 @@ bool FormatSpecifier::hasValidLengthModifier() const {
   }
   return false;
 }
+
+
index e3d76507cd9ce4835517e61917095eaebe70e591..70dbfd30ceefd56b2a5c3dcfd1b7833c9375013d 100644 (file)
@@ -13,7 +13,6 @@
 //===----------------------------------------------------------------------===//
 
 #include "clang/Analysis/Analyses/FormatString.h"
-#include "clang/Sema/Sema.h"
 #include "FormatStringParsing.h"
 
 using clang::analyze_format_string::ArgTypeResult;
@@ -279,27 +278,8 @@ const char *ConversionSpecifier::toString() const {
 // Methods on PrintfSpecifier.
 //===----------------------------------------------------------------------===//
 
-/// \brief Try to find and return a typedef type named Name whose actual type
-/// is Underlying. Return Underlying if such a typedef cannot be found.
-static QualType FindTypedef(Sema &S, const char *Name, QualType Underlying) {
-  ASTContext &Ctx = S.getASTContext();
-  IdentifierInfo &II = Ctx.Idents.get(Name);
-
-  NamedDecl *D = S.LookupSingleName(S.getCurScope(), DeclarationName(&II),
-                                    SourceLocation(), Sema::LookupOrdinaryName);
-
-  if (TypedefDecl *TD = dyn_cast_or_null<TypedefDecl>(D)) {
-    QualType TypedefType = Ctx.getTypedefType(TD, QualType());
-    if (Ctx.getCanonicalType(TypedefType) == Underlying)
-      return TypedefType;
-  }
-
-  return Underlying;
-}
-
-ArgTypeResult PrintfSpecifier::getArgType(Sema &S) const {
+ArgTypeResult PrintfSpecifier::getArgType(ASTContext &Ctx) const {
   const PrintfConversionSpecifier &CS = getConversionSpecifier();
-  ASTContext &Ctx = S.getASTContext();
 
   if (!CS.consumesDataArgument())
     return ArgTypeResult::Invalid();
@@ -321,13 +301,11 @@ ArgTypeResult PrintfSpecifier::getArgType(Sema &S) const {
       case LengthModifier::AsShort: return Ctx.ShortTy;
       case LengthModifier::AsLong: return Ctx.LongTy;
       case LengthModifier::AsLongLong: return Ctx.LongLongTy;
-      case LengthModifier::AsIntMax:
-        return FindTypedef(S, "intmax_t", Ctx.getIntMaxType());
+      case LengthModifier::AsIntMax: return Ctx.getIntMaxType();
       case LengthModifier::AsSizeT:
         // FIXME: How to get the corresponding signed version of size_t?
         return ArgTypeResult();
-      case LengthModifier::AsPtrDiff:
-        return FindTypedef(S, "ptrdiff_t", Ctx.getPointerDiffType());
+      case LengthModifier::AsPtrDiff: return Ctx.getPointerDiffType();
     }
 
   if (CS.isUIntArg())
@@ -339,10 +317,9 @@ ArgTypeResult PrintfSpecifier::getArgType(Sema &S) const {
       case LengthModifier::AsShort: return Ctx.UnsignedShortTy;
       case LengthModifier::AsLong: return Ctx.UnsignedLongTy;
       case LengthModifier::AsLongLong: return Ctx.UnsignedLongLongTy;
-      case LengthModifier::AsIntMax:
-        return FindTypedef(S, "uintmax_t", Ctx.getUIntMaxType());
+      case LengthModifier::AsIntMax: return Ctx.getUIntMaxType();
       case LengthModifier::AsSizeT:
-        return FindTypedef(S, "size_t", Ctx.getSizeType());
+        return Ctx.getSizeType();
       case LengthModifier::AsPtrDiff:
         // FIXME: How to get the corresponding unsigned
         // version of ptrdiff_t?
index c0d6702b589449d4cf42fde0afae6e41b61b31c6..0d640a8c123cafa9bce5bc983aa86233a78d998e 100644 (file)
@@ -2206,7 +2206,7 @@ CheckPrintfHandler::HandlePrintfSpecifier(const analyze_printf::PrintfSpecifier
   // Now type check the data expression that matches the
   // format specifier.
   const Expr *Ex = getDataArg(argIndex);
-  const analyze_printf::ArgTypeResult &ATR = FS.getArgType(S);
+  const analyze_printf::ArgTypeResult &ATR = FS.getArgType(S.Context);
   if (ATR.isValid() && !ATR.matchesType(S.Context, Ex->getType())) {
     // Check if we didn't match because of an implicit cast from a 'char'
     // or 'short' to an 'int'.  This is done because printf is a varargs
diff --git a/test/Sema/format-strings-int-typedefs.c b/test/Sema/format-strings-int-typedefs.c
deleted file mode 100644 (file)
index 2cac9a8..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-// RUN: %clang_cc1 -triple i386-apple-darwin9 -fsyntax-only -verify %s
-
-int printf(char const *, ...);
-
-void test(void) {
-  // size_t, et al. have not been declared yet,
-  // so the warning should refer to the builtin types.
-  printf("%jd", 42.0); // expected-warning {{conversion specifies type 'long long'}}
-  printf("%ju", 42.0); // expected-warning {{conversion specifies type 'unsigned long long'}}
-  printf("%zu", 42.0); // expected-warning {{conversion specifies type 'unsigned long'}}
-  printf("%td", 42.0); // expected-warning {{conversion specifies type 'int'}}
-
-  typedef __typeof(sizeof(int)) size_t;
-  typedef __INTMAX_TYPE__ intmax_t;
-  typedef __UINTMAX_TYPE__ uintmax_t;
-  typedef __PTRDIFF_TYPE__ ptrdiff_t;
-
-  printf("%jd", 42.0); // expected-warning {{conversion specifies type 'intmax_t' (aka 'long long')}}
-  printf("%ju", 42.0); // expected-warning {{conversion specifies type 'uintmax_t' (aka 'unsigned long long')}}
-  printf("%zu", 42.0); // expected-warning {{conversion specifies type 'size_t' (aka 'unsigned long')}}
-  printf("%td", 42.0); // expected-warning {{conversion specifies type 'ptrdiff_t' (aka 'int')}}
-}
-
-void test2(void) {
-  typedef void *size_t;
-
-  // The typedef for size_t does not match the builtin type,
-  // so the warning should not refer to it.
-  printf("%zu", 42.0); // expected-warning {{conversion specifies type 'unsigned long'}}
-}