diff options
author | Ted Kremenek <kremenek@apple.com> | 2013-05-29 21:50:46 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2013-05-29 21:50:46 +0000 |
commit | e3dc7f74bec5f22eeecbad757f7dfdab40fbed12 (patch) | |
tree | 98fc9cdd5abbfabc6827de6f7718fff060e897d0 /clang/lib/Sema/SemaCast.cpp | |
parent | 00e08db393ba584b06d5d13d156c1f46780602f3 (diff) | |
download | bcm5719-llvm-e3dc7f74bec5f22eeecbad757f7dfdab40fbed12.tar.gz bcm5719-llvm-e3dc7f74bec5f22eeecbad757f7dfdab40fbed12.zip |
Split off casts to void* for -Wint-to-pointer-cast to subgroup -Wint-to-void-pointer-cast.
This change is motivated from user feedback that some APIs use
void* as an opaque "context" object that may not really be a pointer.
Such users want an ability to turn off the warning for casts
to void* while preserving the warning for other cases.
Implements <rdar://problem/14016721>.
llvm-svn: 182884
Diffstat (limited to 'clang/lib/Sema/SemaCast.cpp')
-rw-r--r-- | clang/lib/Sema/SemaCast.cpp | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaCast.cpp b/clang/lib/Sema/SemaCast.cpp index eb11a577cb0..3f0a1a36e46 100644 --- a/clang/lib/Sema/SemaCast.cpp +++ b/clang/lib/Sema/SemaCast.cpp @@ -1614,8 +1614,18 @@ static void checkIntToPointerCast(bool CStyle, SourceLocation Loc, && !SrcType->isBooleanType() && !SrcType->isEnumeralType() && !SrcExpr->isIntegerConstantExpr(Self.Context) - && Self.Context.getTypeSize(DestType) > Self.Context.getTypeSize(SrcType)) - Self.Diag(Loc, diag::warn_int_to_pointer_cast) << SrcType << DestType; + && Self.Context.getTypeSize(DestType) > + Self.Context.getTypeSize(SrcType)) { + // Separate between casts to void* and non-void* pointers. + // Some APIs use (abuse) void* for something like a user context, + // and often that value is an integer even if it isn't a pointer itself. + // Having a separate warning flag allows users to control the warning + // for their workflow. + unsigned Diag = DestType->isVoidPointerType() ? + diag::warn_int_to_void_pointer_cast + : diag::warn_int_to_pointer_cast; + Self.Diag(Loc, Diag) << SrcType << DestType; + } } static TryCastResult TryReinterpretCast(Sema &Self, ExprResult &SrcExpr, |