diff options
author | Nick Lewycky <nicholas@mxc.ca> | 2011-12-02 23:21:43 +0000 |
---|---|---|
committer | Nick Lewycky <nicholas@mxc.ca> | 2011-12-02 23:21:43 +0000 |
commit | 687b5df89d4ba91219df578d02087c68c09a0332 (patch) | |
tree | 72ce07514f390ecac3b02890218d448185cd455e | |
parent | 3aaeccc597fa49e5b5aa9c197ef699d2c19ec86b (diff) |
Revert r145697 and dependent patch r145702. It added a dependency from
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
-rw-r--r-- | include/clang/Analysis/Analyses/FormatString.h | 4 | ||||
-rw-r--r-- | lib/Analysis/FormatString.cpp | 25 | ||||
-rw-r--r-- | lib/Analysis/PrintfFormatString.cpp | 33 | ||||
-rw-r--r-- | lib/Sema/SemaChecking.cpp | 2 | ||||
-rw-r--r-- | test/Sema/format-strings-int-typedefs.c | 30 |
5 files changed, 20 insertions, 74 deletions
diff --git a/include/clang/Analysis/Analyses/FormatString.h b/include/clang/Analysis/Analyses/FormatString.h index 4385fc3af0..b2d45e36cb 100644 --- a/include/clang/Analysis/Analyses/FormatString.h +++ b/include/clang/Analysis/Analyses/FormatString.h @@ -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; diff --git a/lib/Analysis/FormatString.cpp b/lib/Analysis/FormatString.cpp index 0171bb7aec..6498ded4e3 100644 --- a/lib/Analysis/FormatString.cpp +++ b/lib/Analysis/FormatString.cpp @@ -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; } + + diff --git a/lib/Analysis/PrintfFormatString.cpp b/lib/Analysis/PrintfFormatString.cpp index e3d76507cd..70dbfd30ce 100644 --- a/lib/Analysis/PrintfFormatString.cpp +++ b/lib/Analysis/PrintfFormatString.cpp @@ -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? diff --git a/lib/Sema/SemaChecking.cpp b/lib/Sema/SemaChecking.cpp index c0d6702b58..0d640a8c12 100644 --- a/lib/Sema/SemaChecking.cpp +++ b/lib/Sema/SemaChecking.cpp @@ -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 index 2cac9a875d..0000000000 --- a/test/Sema/format-strings-int-typedefs.c +++ /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'}} -} |