aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Lewycky <nicholas@mxc.ca>2011-12-02 23:21:43 +0000
committerNick Lewycky <nicholas@mxc.ca>2011-12-02 23:21:43 +0000
commit687b5df89d4ba91219df578d02087c68c09a0332 (patch)
tree72ce07514f390ecac3b02890218d448185cd455e
parent3aaeccc597fa49e5b5aa9c197ef699d2c19ec86b (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.h4
-rw-r--r--lib/Analysis/FormatString.cpp25
-rw-r--r--lib/Analysis/PrintfFormatString.cpp33
-rw-r--r--lib/Sema/SemaChecking.cpp2
-rw-r--r--test/Sema/format-strings-int-typedefs.c30
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'}}
-}