From: John McCall Date: Wed, 11 Nov 2009 22:52:37 +0000 (+0000) Subject: Fix PR 5422: handle lvalue results when evaluating 'based' ptrtoints as part of X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8406aedf4782771e520614ee379594dc0a4f7d5f;p=clang Fix PR 5422: handle lvalue results when evaluating 'based' ptrtoints as part of the -Wconversion check. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@86891 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/Sema.cpp b/lib/Sema/Sema.cpp index 5c92b65f82..f6f572feec 100644 --- a/lib/Sema/Sema.cpp +++ b/lib/Sema/Sema.cpp @@ -424,9 +424,15 @@ static bool IsSameIntAfterCast(const APValue &value, unsigned TargetWidth) { return true; } - assert(value.isComplexInt()); - return IsSameIntAfterCast(value.getComplexIntReal(), TargetWidth) && - IsSameIntAfterCast(value.getComplexIntImag(), TargetWidth); + if (value.isComplexInt()) { + return IsSameIntAfterCast(value.getComplexIntReal(), TargetWidth) && + IsSameIntAfterCast(value.getComplexIntImag(), TargetWidth); + } + + // This can happen with lossless casts to intptr_t of "based" lvalues. + // Assume it might use arbitrary bits. + assert(value.isLValue()); + return false; } diff --git a/test/Sema/conversion.c b/test/Sema/conversion.c index 0c7d86aa4a..bca23f8f8d 100644 --- a/test/Sema/conversion.c +++ b/test/Sema/conversion.c @@ -229,3 +229,9 @@ void test15(char c) { c = c + 1 + c * 2; c = (short) c + 1 + c * 2; // expected-warning {{implicit cast loses integer precision}} } + +// PR 5422 +extern void *test16_external; +void test16(void) { + int a = (unsigned long) &test16_external; // expected-warning {{implicit cast loses integer precision}} +}