r272653 - Reverting "Warn when taking address of a packed member"

Roger Ferrer Ibanez via cfe-commits cfe-commits at lists.llvm.org
Tue Jun 14 04:20:09 PDT 2016


Author: rogfer01
Date: Tue Jun 14 06:20:07 2016
New Revision: 272653

URL: http://llvm.org/viewvc/llvm-project?rev=272653&view=rev
Log:
Reverting "Warn when taking address of a packed member"

This new diagnostic is causing some false positives that have to be addressed.

This reverts commit 272552



Removed:
    cfe/trunk/test/Sema/address-packed.c
    cfe/trunk/test/SemaCXX/address-packed.cpp
Modified:
    cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
    cfe/trunk/lib/Sema/SemaExpr.cpp

Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=272653&r1=272652&r2=272653&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Tue Jun 14 06:20:07 2016
@@ -5388,9 +5388,6 @@ def warn_pointer_indirection_from_incomp
   "dereference of type %1 that was reinterpret_cast from type %0 has undefined "
   "behavior">,
   InGroup<UndefinedReinterpretCast>, DefaultIgnore;
-def warn_taking_address_of_packed_member : Warning<
-  "taking address of packed member %0 of class or structure %q1 may result in an unaligned pointer value">,
-  InGroup<DiagGroup<"address-of-packed-member">>;
 
 def err_objc_object_assignment : Error<
   "cannot assign to class object (%0 invalid)">;

Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=272653&r1=272652&r2=272653&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExpr.cpp Tue Jun 14 06:20:07 2016
@@ -10521,30 +10521,6 @@ QualType Sema::CheckAddressOfOperand(Exp
     return QualType();
   }
 
-  // Taking the address of a data member/field of a packed
-  // struct may be a problem if the pointer value is dereferenced.
-  Expr *rhs = OrigOp.get();
-  const auto *ME = dyn_cast<MemberExpr>(rhs);
-  while (ME && isa<FieldDecl>(ME->getMemberDecl())) {
-    QualType BaseType = ME->getBase()->getType();
-    if (ME->isArrow())
-      BaseType = BaseType->getPointeeType();
-    RecordDecl *RD = BaseType->getAs<RecordType>()->getDecl();
-
-    ValueDecl *MD = ME->getMemberDecl();
-    bool ByteAligned = Context.getTypeAlignInChars(MD->getType()).isOne();
-    if (ByteAligned) // Attribute packed does not have any effect.
-      break;
-
-    if (!ByteAligned &&
-        (RD->hasAttr<PackedAttr>() || (MD->hasAttr<PackedAttr>()))) {
-      Diag(OpLoc, diag::warn_taking_address_of_packed_member)
-          << MD << RD << rhs->getSourceRange();
-      break;
-    }
-    ME = dyn_cast<MemberExpr>(ME->getBase());
-  }
-
   return Context.getPointerType(op->getType());
 }
 

Removed: cfe/trunk/test/Sema/address-packed.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/address-packed.c?rev=272652&view=auto
==============================================================================
--- cfe/trunk/test/Sema/address-packed.c (original)
+++ cfe/trunk/test/Sema/address-packed.c (removed)
@@ -1,126 +0,0 @@
-// RUN: %clang_cc1 -fsyntax-only -verify %s
-extern void f1(int *);
-extern void f2(char *);
-
-struct Ok {
-  char c;
-  int x;
-};
-
-struct __attribute__((packed)) Arguable {
-  char c0;
-  int x;
-  char c1;
-};
-
-union __attribute__((packed)) UnionArguable {
-  char c;
-  int x;
-};
-
-typedef struct Arguable ArguableT;
-
-struct Arguable *get_arguable();
-
-void g0(void) {
-  {
-    struct Ok ok;
-    f1(&ok.x); // no-warning
-    f2(&ok.c); // no-warning
-  }
-  {
-    struct Arguable arguable;
-    f2(&arguable.c0); // no-warning
-    f1(&arguable.x);  // expected-warning {{packed member 'x' of class or structure 'Arguable'}}
-    f2(&arguable.c1); // no-warning
-  }
-  {
-    union UnionArguable arguable;
-    f2(&arguable.c); // no-warning
-    f1(&arguable.x); // expected-warning {{packed member 'x' of class or structure 'UnionArguable'}}
-  }
-  {
-    ArguableT arguable;
-    f2(&arguable.c0); // no-warning
-    f1(&arguable.x);  // expected-warning {{packed member 'x' of class or structure 'Arguable'}}
-    f2(&arguable.c1); // no-warning
-  }
-  {
-    struct Arguable *arguable = get_arguable();
-    // These do not produce any warning because of the parentheses.
-    f2(&(arguable->c0)); // no-warning
-    f1(&(arguable->x));  // no-warning
-    f2(&(arguable->c1)); // no-warning
-  }
-  {
-    ArguableT *arguable = get_arguable();
-    // These do not produce any warning because of the parentheses.
-    f2(&(arguable->c0)); // no-warning
-    f1(&(arguable->x));  // no-warning
-    f2(&(arguable->c1)); // no-warning
-  }
-}
-
-struct S1 {
-  char c;
-  int i __attribute__((packed));
-};
-
-int *g1(struct S1 *s1) {
-  return &s1->i; // expected-warning {{packed member 'i' of class or structure 'S1'}}
-}
-
-struct S2_i {
-  int i;
-};
-struct __attribute__((packed)) S2 {
-  char c;
-  struct S2_i inner;
-};
-
-int *g2(struct S2 *s2) {
-  return &s2->inner.i; // expected-warning {{packed member 'inner' of class or structure 'S2'}}
-}
-
-struct S2_a {
-  char c;
-  struct S2_i inner __attribute__((packed));
-};
-
-int *g2_a(struct S2_a *s2_a) {
-  return &s2_a->inner.i; // expected-warning {{packed member 'inner' of class or structure 'S2_a'}}
-}
-
-struct __attribute__((packed)) S3 {
-  char c;
-  struct {
-    int i;
-  } inner;
-};
-
-int *g3(struct S3 *s3) {
-  return &s3->inner.i; // expected-warning {{packed member 'inner' of class or structure 'S3'}}
-}
-
-struct S4 {
-  char c;
-  struct __attribute__((packed)) {
-    int i;
-  } inner;
-};
-
-int *g4(struct S4 *s4) {
-  return &s4->inner.i; // expected-warning {{packed member 'i' of class or structure 'S4::(anonymous)'}}
-}
-
-struct S5 {
-  char c;
-  struct {
-    char c1;
-    int i __attribute__((packed));
-  } inner;
-};
-
-int *g5(struct S5 *s5) {
-  return &s5->inner.i; // expected-warning {{packed member 'i' of class or structure 'S5::(anonymous)'}}
-}

Removed: cfe/trunk/test/SemaCXX/address-packed.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/address-packed.cpp?rev=272652&view=auto
==============================================================================
--- cfe/trunk/test/SemaCXX/address-packed.cpp (original)
+++ cfe/trunk/test/SemaCXX/address-packed.cpp (removed)
@@ -1,100 +0,0 @@
-// RUN: %clang_cc1 -fsyntax-only -verify %s
-extern void f1(int *);
-extern void f2(char *);
-
-struct __attribute__((packed)) Arguable {
-  int x;
-  char c;
-  static void foo();
-};
-
-extern void f3(void());
-
-namespace Foo {
-struct __attribute__((packed)) Arguable {
-  char c;
-  int x;
-  static void foo();
-};
-}
-
-struct Arguable *get_arguable();
-
-void g0() {
-  {
-    Foo::Arguable arguable;
-    f1(&arguable.x);   // expected-warning {{packed member 'x' of class or structure 'Foo::Arguable'}}
-    f2(&arguable.c);   // no-warning
-    f3(&arguable.foo); // no-warning
-  }
-  {
-    Arguable arguable1;
-    Arguable &arguable(arguable1);
-    f1(&arguable.x);   // expected-warning {{packed member 'x' of class or structure 'Arguable'}}
-    f2(&arguable.c);   // no-warning
-    f3(&arguable.foo); // no-warning
-  }
-  {
-    Arguable *arguable1;
-    Arguable *&arguable(arguable1);
-    f1(&arguable->x);   // expected-warning {{packed member 'x' of class or structure 'Arguable'}}
-    f2(&arguable->c);   // no-warning
-    f3(&arguable->foo); // no-warning
-  }
-}
-
-struct __attribute__((packed)) A {
-  int x;
-  char c;
-
-  int *f0() {
-    return &this->x; // expected-warning {{packed member 'x' of class or structure 'A'}}
-  }
-
-  int *g0() {
-    return &x; // expected-warning {{packed member 'x' of class or structure 'A'}}
-  }
-
-  char *h0() {
-    return &c; // no-warning
-  }
-};
-
-struct B : A {
-  int *f1() {
-    return &this->x; // expected-warning {{packed member 'x' of class or structure 'A'}}
-  }
-
-  int *g1() {
-    return &x; // expected-warning {{packed member 'x' of class or structure 'A'}}
-  }
-
-  char *h1() {
-    return &c; // no-warning
-  }
-};
-
-template <typename Ty>
-class __attribute__((packed)) S {
-  Ty X;
-
-public:
-  const Ty *get() const {
-    return &X; // expected-warning {{packed member 'X' of class or structure 'S<int>'}}
-               // expected-warning at -1 {{packed member 'X' of class or structure 'S<float>'}}
-  }
-};
-
-template <typename Ty>
-void h(Ty *);
-
-void g1() {
-  S<int> s1;
-  s1.get(); // expected-note {{in instantiation of member function 'S<int>::get'}}
-
-  S<char> s2;
-  s2.get();
-
-  S<float> s3;
-  s3.get(); // expected-note {{in instantiation of member function 'S<float>::get'}}
-}




More information about the cfe-commits mailing list