summaryrefslogtreecommitdiff
path: root/test/Sema/builtin-preserve-access-index.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/Sema/builtin-preserve-access-index.c')
-rw-r--r--test/Sema/builtin-preserve-access-index.c26
1 files changed, 22 insertions, 4 deletions
diff --git a/test/Sema/builtin-preserve-access-index.c b/test/Sema/builtin-preserve-access-index.c
index c10ceb5145..71da8457fa 100644
--- a/test/Sema/builtin-preserve-access-index.c
+++ b/test/Sema/builtin-preserve-access-index.c
@@ -4,10 +4,28 @@ const void *invalid1(const int *arg) {
return __builtin_preserve_access_index(&arg[1], 1); // expected-error {{too many arguments to function call, expected 1, have 2}}
}
-void *invalid2(const int *arg) {
- return __builtin_preserve_access_index(&arg[1]); // expected-warning {{returning 'const void *' from a function with result type 'void *' discards qualifiers}}
+const void *invalid2(const int *arg) {
+ return __builtin_preserve_access_index(1); // expected-error {{__builtin_preserve_access_index argument must a pointer type instead of 'int'}}
}
-const void *invalid3(const int *arg) {
- return __builtin_preserve_access_index(1); // expected-warning {{incompatible integer to pointer conversion passing 'int' to parameter of type 'const void *'}}
+void *invalid3(const int *arg) {
+ return __builtin_preserve_access_index(&arg[1]); // expected-warning {{returning 'const int *' from a function with result type 'void *' discards qualifiers}}
+}
+
+const void *invalid4(volatile const int *arg) {
+ return __builtin_preserve_access_index(arg); // expected-warning {{returning 'const volatile int *' from a function with result type 'const void *' discards qualifiers}}
+}
+
+int *valid5(int *arg) {
+ return __builtin_preserve_access_index(arg);
+}
+
+int valid6(const volatile int *arg) {
+ return *__builtin_preserve_access_index(arg);
+}
+
+struct s { int a; int b; };
+
+int valid7(struct s *arg) {
+ return *__builtin_preserve_access_index(&arg->b);
}