summaryrefslogtreecommitdiffstats
path: root/test/Sema
diff options
context:
space:
mode:
authorRoman Lebedev <lebedev.ri@gmail.com>2017-07-03 17:59:22 +0000
committerRoman Lebedev <lebedev.ri@gmail.com>2017-07-03 17:59:22 +0000
commit2ea9de261c4475b62359e9ac613fb1ca09676418 (patch)
tree048ff384eeade89ee46d564fb05726371cc8a5eb /test/Sema
parent063721498032b28ccb1bc0a4cb257882317113bb (diff)
[clang] Implement -Wcast-qual for C++
Summary: This way, the behavior of that warning flag more closely resembles that of GCC. Do note that there is at least one false-negative (see FIXME in tests). Fixes PR4802. Testing: ``` ninja check-clang-sema check-clang-semacxx ``` Reviewers: dblaikie, majnemer, rnk Reviewed By: dblaikie, rnk Subscribers: mclow.lists, cfe-commits, alexfh, rnk Differential Revision: https://reviews.llvm.org/D33102 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@307045 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/Sema')
-rw-r--r--test/Sema/warn-cast-qual.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/test/Sema/warn-cast-qual.c b/test/Sema/warn-cast-qual.c
index dc11f5717e..a682cad75e 100644
--- a/test/Sema/warn-cast-qual.c
+++ b/test/Sema/warn-cast-qual.c
@@ -1,4 +1,5 @@
// RUN: %clang_cc1 -triple x86_64-unknown-unknown -fsyntax-only -Wcast-qual -verify %s
+// RUN: %clang_cc1 -triple x86_64-unknown-unknown -x c++ -fsyntax-only -Wcast-qual -verify %s
#include <stdint.h>
@@ -26,4 +27,34 @@ void foo() {
const char **charptrptrc;
char **charptrptr = (char **)charptrptrc; // expected-warning {{cast from 'const char *' to 'char *' drops const qualifier}}
+
+ const char *constcharptr;
+ char *charptr = (char *)constcharptr; // expected-warning {{cast from 'const char *' to 'char *' drops const qualifier}}
+ const char *constcharptr2 = (char *)constcharptr; // expected-warning {{cast from 'const char *' to 'char *' drops const qualifier}}
+ const char *charptr2 = (char *)charptr; // no warning
+}
+
+void bar_0() {
+ struct C {
+ const int a;
+ int b;
+ };
+
+ const struct C S = {0, 0};
+
+ *(int *)(&S.a) = 0; // expected-warning {{cast from 'const int *' to 'int *' drops const qualifier}}
+ *(int *)(&S.b) = 0; // expected-warning {{cast from 'const int *' to 'int *' drops const qualifier}}
+}
+
+void bar_1() {
+ struct C {
+ const int a;
+ int b;
+ };
+
+ struct C S = {0, 0};
+ S.b = 0; // no warning
+
+ *(int *)(&S.a) = 0; // expected-warning {{cast from 'const int *' to 'int *' drops const qualifier}}
+ *(int *)(&S.b) = 0; // no warning
}