diff options
| author | Douglas Gregor <dgregor@apple.com> | 2010-08-18 21:25:30 +0000 |
|---|---|---|
| committer | Douglas Gregor <dgregor@apple.com> | 2010-08-18 21:25:30 +0000 |
| commit | fb640869ed14e5e3546fd88807d908258c0d4f9c (patch) | |
| tree | 36e01865a0351b47668f00eb64cdcd3e13c8456e /clang | |
| parent | b37af7de47e5470a4d1416b2e08c80450d6125bc (diff) | |
| download | bcm5719-llvm-fb640869ed14e5e3546fd88807d908258c0d4f9c.tar.gz bcm5719-llvm-fb640869ed14e5e3546fd88807d908258c0d4f9c.zip | |
There is no pointer conversion between to similar types (i.e., same
type ignoring cv-qualifiers). These are qualification
conversions. Fixes PR7934.
llvm-svn: 111428
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/Sema/SemaOverload.cpp | 5 | ||||
| -rw-r--r-- | clang/test/SemaCXX/conversion-function.cpp | 22 |
2 files changed, 27 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index 8a0732702b9..694975546cd 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -1406,6 +1406,11 @@ bool Sema::IsPointerConversion(Expr *From, QualType FromType, QualType ToType, QualType FromPointeeType = FromTypePtr->getPointeeType(); + // If the unqualified pointee types are the same, this can't be a + // pointer conversion, so don't do all of the work below. + if (Context.hasSameUnqualifiedType(FromPointeeType, ToPointeeType)) + return false; + // An rvalue of type "pointer to cv T," where T is an object type, // can be converted to an rvalue of type "pointer to cv void" (C++ // 4.10p2). diff --git a/clang/test/SemaCXX/conversion-function.cpp b/clang/test/SemaCXX/conversion-function.cpp index 73b78f414a5..951cdb3f51a 100644 --- a/clang/test/SemaCXX/conversion-function.cpp +++ b/clang/test/SemaCXX/conversion-function.cpp @@ -248,3 +248,25 @@ namespace PR7055 { Y f2(foo()); } + +namespace PR7934 { + typedef unsigned char uint8; + + struct MutablePtr { + MutablePtr() : ptr(0) {} + void *ptr; + + operator void*() { return ptr; } + + private: + operator uint8*() { return reinterpret_cast<uint8*>(ptr); } + operator const char*() const { return reinterpret_cast<const char*>(ptr); } + }; + + void fake_memcpy(const void *); + + void use() { + MutablePtr ptr; + fake_memcpy(ptr); + } +} |

