From fdba18263ffd624846701ad115d35edb3e2ee0a7 Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Tue, 31 Jan 2012 05:37:48 +0000 Subject: [PATCH] Don't warn about -Wshorten-64-to-32 in unreachable code. Fixes . Apparently this is a common idiom in Linux (among other places). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@149359 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaChecking.cpp | 18 ++++++++++++++---- test/Sema/conversion-64-32.c | 20 ++++++++++++++++++++ 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/lib/Sema/SemaChecking.cpp b/lib/Sema/SemaChecking.cpp index cd9d071a24..b02e5b598a 100644 --- a/lib/Sema/SemaChecking.cpp +++ b/lib/Sema/SemaChecking.cpp @@ -3693,15 +3693,24 @@ static void AnalyzeAssignment(Sema &S, BinaryOperator *E) { /// Diagnose an implicit cast; purely a helper for CheckImplicitConversion. static void DiagnoseImpCast(Sema &S, Expr *E, QualType SourceType, QualType T, - SourceLocation CContext, unsigned diag) { + SourceLocation CContext, unsigned diag, + bool pruneControlFlow = false) { + if (pruneControlFlow) { + S.DiagRuntimeBehavior(E->getExprLoc(), E, + S.PDiag(diag) + << SourceType << T << E->getSourceRange() + << SourceRange(CContext)); + return; + } S.Diag(E->getExprLoc(), diag) << SourceType << T << E->getSourceRange() << SourceRange(CContext); } /// Diagnose an implicit cast; purely a helper for CheckImplicitConversion. static void DiagnoseImpCast(Sema &S, Expr *E, QualType T, - SourceLocation CContext, unsigned diag) { - DiagnoseImpCast(S, E, E->getType(), T, CContext, diag); + SourceLocation CContext, unsigned diag, + bool pruneControlFlow = false) { + DiagnoseImpCast(S, E, E->getType(), T, CContext, diag, pruneControlFlow); } /// Diagnose an implicit cast from a literal expression. Does not warn when the @@ -3907,7 +3916,8 @@ void CheckImplicitConversion(Sema &S, Expr *E, QualType T, return; if (SourceRange.Width == 64 && TargetRange.Width == 32) - return DiagnoseImpCast(S, E, T, CC, diag::warn_impcast_integer_64_32); + return DiagnoseImpCast(S, E, T, CC, diag::warn_impcast_integer_64_32, + /* pruneControlFlow */ true); return DiagnoseImpCast(S, E, T, CC, diag::warn_impcast_integer_precision); } diff --git a/test/Sema/conversion-64-32.c b/test/Sema/conversion-64-32.c index 112e995102..62db7dcd2e 100644 --- a/test/Sema/conversion-64-32.c +++ b/test/Sema/conversion-64-32.c @@ -13,3 +13,23 @@ int4 test1(long2 a) { int4 v127 = a; // no warning. return v127; } + +// +// Don't warn about -Wshorten-64-to-32 in unreachable code. +typedef unsigned int uint32_t; +typedef unsigned long long uint64_t; +int rdar10759934() { + uint32_t thing = 0; + uint64_t thing2 = 0; + + switch (sizeof(thing2)) { + case 8: + break; + case 4: + thing = thing2; // no-warning + default: + break; + } + + return 0; +} -- 2.40.0