@@ -2246,7 +2246,14 @@ parse_sanitizer_options (const char *p, location_t loc, int scode,
flags |= sanitizer_opts[i].flag;
}
else
- flags &= ~sanitizer_opts[i].flag;
+ {
+ flags &= ~sanitizer_opts[i].flag;
+ /* Don't always clear SANITIZE_ADDRESS if it was previously
+ set: -fsanitize=address -fno-sanitize=kernel-address should
+ leave SANITIZE_ADDRESS set. */
+ if (flags & (SANITIZE_KERNEL_ADDRESS | SANITIZE_USER_ADDRESS))
+ flags |= SANITIZE_ADDRESS;
+ }
found = true;
break;
}
new file mode 100644
@@ -0,0 +1,15 @@
+/* PR middle-end/108543 */
+/* { dg-do compile } */
+/* { dg-options "-fsanitize=address -fno-sanitize=kernel-address -fsanitize=pointer-subtract" } */
+
+struct S {
+ long _M_p;
+};
+
+typedef struct S S;
+
+__PTRDIFF_TYPE__
+f (S __x, S __y)
+{
+ return &__x._M_p - &__y._M_p;
+}
new file mode 100644
@@ -0,0 +1,15 @@
+/* PR middle-end/108543 */
+/* { dg-do compile } */
+/* { dg-options "-fsanitize=kernel-address -fno-sanitize=address -fsanitize=pointer-subtract" } */
+
+struct S {
+ long _M_p;
+};
+
+typedef struct S S;
+
+__PTRDIFF_TYPE__
+f (S __x, S __y)
+{
+ return &__x._M_p - &__y._M_p;
+}
new file mode 100644
@@ -0,0 +1,15 @@
+/* PR middle-end/108543 */
+/* { dg-do compile } */
+/* { dg-options "-fno-sanitize=kernel-address -fsanitize=address -fsanitize=pointer-subtract" } */
+
+struct S {
+ long _M_p;
+};
+
+typedef struct S S;
+
+__PTRDIFF_TYPE__
+f (S __x, S __y)
+{
+ return &__x._M_p - &__y._M_p;
+}
new file mode 100644
@@ -0,0 +1,15 @@
+/* PR middle-end/108543 */
+/* { dg-do compile } */
+/* { dg-options "-fno-sanitize=address -fsanitize=kernel-address -fsanitize=pointer-subtract" } */
+
+struct S {
+ long _M_p;
+};
+
+typedef struct S S;
+
+__PTRDIFF_TYPE__
+f (S __x, S __y)
+{
+ return &__x._M_p - &__y._M_p;
+}