]> granicus.if.org Git - clang/commitdiff
When diagnosing taking address of packed members skip __unaligned-qualified expressions
authorRoger Ferrer Ibanez <roger.ferreribanez@arm.com>
Mon, 13 Mar 2017 13:18:21 +0000 (13:18 +0000)
committerRoger Ferrer Ibanez <roger.ferreribanez@arm.com>
Mon, 13 Mar 2017 13:18:21 +0000 (13:18 +0000)
Given that we have already explicitly stated in the qualifier that the
expression is __unaligned, it makes little sense to diagnose that the address
of the packed member may not be aligned.

Differential Revision: https://reviews.llvm.org/D30884

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@297620 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaChecking.cpp
test/Sema/address-unaligned.c [new file with mode: 0644]

index c15f4b9060be2c18d2b8a9555fea44432d809585..b34a1c146fc1d4540094876d259f12016919333e 100644 (file)
@@ -11851,6 +11851,10 @@ void Sema::RefersToMemberWithReducedAlignment(
   if (!ME)
     return;
 
+  // No need to check expressions with an __unaligned-qualified type.
+  if (E->getType().getQualifiers().hasUnaligned())
+    return;
+
   // For a chain of MemberExpr like "a.b.c.d" this list
   // will keep FieldDecl's like [d, c, b].
   SmallVector<FieldDecl *, 4> ReverseMemberChain;
diff --git a/test/Sema/address-unaligned.c b/test/Sema/address-unaligned.c
new file mode 100644 (file)
index 0000000..6719509
--- /dev/null
@@ -0,0 +1,16 @@
+// RUN: %clang_cc1 -fsyntax-only -fms-extensions -verify %s
+// expected-no-diagnostics
+
+typedef
+struct __attribute__((packed)) S1 {
+  char c0;
+  int x;
+  char c1;
+} S1;
+
+void bar(__unaligned int *);
+
+void foo(__unaligned S1* s1)
+{
+    bar(&s1->x);
+}