diff options
| author | Richard Smith <richard-llvm@metafoo.co.uk> | 2018-07-10 23:04:35 +0000 |
|---|---|---|
| committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2018-07-10 23:04:35 +0000 |
| commit | f276e2dc461833d3ef0b89a0b09d2e11776d9e84 (patch) | |
| tree | 02b9a8f6fc1e84d6e2f6b4b71ed5689fbdd92d88 /clang/test/Sema | |
| parent | 0ed0febb3e58081edf1c69b62d28f72703a417f8 (diff) | |
| download | bcm5719-llvm-f276e2dc461833d3ef0b89a0b09d2e11776d9e84.tar.gz bcm5719-llvm-f276e2dc461833d3ef0b89a0b09d2e11776d9e84.zip | |
Fix determination of whether a reinterpret_cast casts away constness.
The "casts away constness" check doesn't care at all how the different
layers of the source and destination type were formed: for example, if
the source is a pointer and the destination is a pointer-to-member, the
types are still decomposed and their pointee qualifications are still
checked.
This rule is bizarre and somewhat ridiculous, so as an extension we
accept code making use of such reinterpret_casts with a warning outside
of SFINAE contexts.
llvm-svn: 336738
Diffstat (limited to 'clang/test/Sema')
| -rw-r--r-- | clang/test/Sema/warn-cast-qual.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/clang/test/Sema/warn-cast-qual.c b/clang/test/Sema/warn-cast-qual.c index a682cad75ed..789bde15b13 100644 --- a/clang/test/Sema/warn-cast-qual.c +++ b/clang/test/Sema/warn-cast-qual.c @@ -4,11 +4,15 @@ #include <stdint.h> void foo() { - const char * const ptr = 0; - const char * const *ptrptr = 0; + const char *const ptr = 0; + const char *const *ptrptr = 0; + char *const *ptrcptr = 0; + char **ptrptr2 = 0; char *y = (char *)ptr; // expected-warning {{cast from 'const char *' to 'char *' drops const qualifier}} - char **y1 = (char **)ptrptr; // expected-warning {{cast from 'const char *const' to 'char *' drops const qualifier}} + char **y1 = (char **)ptrptr; // expected-warning {{cast from 'const char *const *' to 'char **' drops const qualifier}} const char **y2 = (const char **)ptrptr; // expected-warning {{cast from 'const char *const *' to 'const char **' drops const qualifier}} + char *const *y3 = (char *const *)ptrptr; // expected-warning {{cast from 'const char *const' to 'char *const' drops const qualifier}} + const char **y4 = (const char **)ptrcptr; // expected-warning {{cast from 'char *const *' to 'const char **' drops const qualifier}} char *z = (char *)(uintptr_t)(const void *)ptr; // no warning char *z1 = (char *)(const void *)ptr; // expected-warning {{cast from 'const void *' to 'char *' drops const qualifier}} |

