r275462 - Reverting 275417
Roger Ferrer Ibanez via cfe-commits
cfe-commits at lists.llvm.org
Thu Jul 14 13:05:31 PDT 2016
Author: rogfer01
Date: Thu Jul 14 15:05:30 2016
New Revision: 275462
URL: http://llvm.org/viewvc/llvm-project?rev=275462&view=rev
Log:
Reverting 275417
This change has triggered unexpected failures.
Removed:
cfe/trunk/test/Sema/address-packed-member-memops.c
cfe/trunk/test/Sema/address-packed.c
cfe/trunk/test/SemaCXX/address-packed-member-memops.cpp
cfe/trunk/test/SemaCXX/address-packed.cpp
Modified:
cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
cfe/trunk/include/clang/Sema/Sema.h
cfe/trunk/lib/Sema/SemaCast.cpp
cfe/trunk/lib/Sema/SemaChecking.cpp
cfe/trunk/lib/Sema/SemaExpr.cpp
cfe/trunk/lib/Sema/SemaInit.cpp
Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=275462&r1=275461&r2=275462&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Thu Jul 14 15:05:30 2016
@@ -5425,11 +5425,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_binding_reference_to_packed_member : Error<
- "binding reference to packed member %0 of class or structure %q1">;
def err_objc_object_assignment : Error<
"cannot assign to class object (%0 invalid)">;
Modified: cfe/trunk/include/clang/Sema/Sema.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=275462&r1=275461&r2=275462&view=diff
==============================================================================
--- cfe/trunk/include/clang/Sema/Sema.h (original)
+++ cfe/trunk/include/clang/Sema/Sema.h Thu Jul 14 15:05:30 2016
@@ -9518,10 +9518,6 @@ private:
void CheckArgumentWithTypeTag(const ArgumentWithTypeTagAttr *Attr,
const Expr * const *ExprArgs);
- /// \brief Check if we are taking the address of a packed field
- /// as this may be a problem if the pointer value is dereferenced.
- void CheckAddressOfPackedMember(Expr *rhs);
-
/// \brief The parser's current scope.
///
/// The parser maintains this state here.
@@ -9600,51 +9596,6 @@ public:
// Emitting members of dllexported classes is delayed until the class
// (including field initializers) is fully parsed.
SmallVector<CXXRecordDecl*, 4> DelayedDllExportClasses;
-
-private:
- /// \brief Helper class that collects misaligned member designations and
- /// their location info for delayed diagnostics.
- struct MisalignedMember {
- Expr *E;
- RecordDecl *RD;
- ValueDecl *MD;
- CharUnits Alignment;
-
- MisalignedMember() : E(), RD(), MD(), Alignment() {}
- MisalignedMember(Expr *E, RecordDecl *RD, ValueDecl *MD,
- CharUnits Alignment)
- : E(E), RD(RD), MD(MD), Alignment(Alignment) {}
- explicit MisalignedMember(Expr *E)
- : MisalignedMember(E, nullptr, nullptr, CharUnits()) {}
-
- bool operator==(const MisalignedMember &m) { return this->E == m.E; }
- };
- /// \brief Small set of gathered accesses to potentially misaligned members
- /// due to the packed attribute.
- SmallVector<MisalignedMember, 4> MisalignedMembers;
-
- /// \brief Adds an expression to the set of gathered misaligned members.
- void AddPotentialMisalignedMembers(Expr *E, RecordDecl *RD, ValueDecl *MD,
- CharUnits Alignment);
-
-public:
- /// \brief Diagnoses the current set of gathered accesses. This typically
- /// happens at full expression level. The set is cleared after emitting the
- /// diagnostics.
- void DiagnoseMisalignedMembers();
-
- /// \brief This function checks if the expression is in the sef of potentially
- /// misaligned members and it is converted to some pointer type T with lower
- /// or equal alignment requirements. If so it removes it. This is used when
- /// we do not want to diagnose such misaligned access (e.g. in conversions to void*).
- void DiscardMisalignedMemberAddress(const Type *T, Expr *E);
-
- /// \brief This function calls Action when it determines that E designates a
- /// misaligned member due to the packed attribute. This is used to emit
- /// local diagnostics like in reference binding.
- void RefersToMemberWithReducedAlignment(
- Expr *E,
- std::function<void(Expr *, RecordDecl *, ValueDecl *, CharUnits)> Action);
};
/// \brief RAII object that enters a new expression evaluation context.
Modified: cfe/trunk/lib/Sema/SemaCast.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaCast.cpp?rev=275462&r1=275461&r2=275462&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaCast.cpp (original)
+++ cfe/trunk/lib/Sema/SemaCast.cpp Thu Jul 14 15:05:30 2016
@@ -256,7 +256,6 @@ Sema::BuildCXXNamedCast(SourceLocation O
Op.CheckConstCast();
if (Op.SrcExpr.isInvalid())
return ExprError();
- DiscardMisalignedMemberAddress(DestType.getTypePtr(), E);
}
return Op.complete(CXXConstCastExpr::Create(Context, Op.ResultType,
Op.ValueKind, Op.SrcExpr.get(), DestTInfo,
@@ -280,7 +279,6 @@ Sema::BuildCXXNamedCast(SourceLocation O
Op.CheckReinterpretCast();
if (Op.SrcExpr.isInvalid())
return ExprError();
- DiscardMisalignedMemberAddress(DestType.getTypePtr(), E);
}
return Op.complete(CXXReinterpretCastExpr::Create(Context, Op.ResultType,
Op.ValueKind, Op.Kind, Op.SrcExpr.get(),
@@ -293,7 +291,6 @@ Sema::BuildCXXNamedCast(SourceLocation O
Op.CheckStaticCast();
if (Op.SrcExpr.isInvalid())
return ExprError();
- DiscardMisalignedMemberAddress(DestType.getTypePtr(), E);
}
return Op.complete(CXXStaticCastExpr::Create(Context, Op.ResultType,
Modified: cfe/trunk/lib/Sema/SemaChecking.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaChecking.cpp?rev=275462&r1=275461&r2=275462&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaChecking.cpp (original)
+++ cfe/trunk/lib/Sema/SemaChecking.cpp Thu Jul 14 15:05:30 2016
@@ -8302,8 +8302,6 @@ void CheckImplicitConversion(Sema &S, Ex
DiagnoseNullConversion(S, E, T, CC);
- S.DiscardMisalignedMemberAddress(Target, E);
-
if (!Source->isIntegerType() || !Target->isIntegerType())
return;
@@ -9373,7 +9371,6 @@ void Sema::CheckCompletedExpr(Expr *E, S
CheckUnsequencedOperations(E);
if (!IsConstexpr && !E->isValueDependent())
CheckForIntOverflow(E);
- DiagnoseMisalignedMembers();
}
void Sema::CheckBitFieldInitialization(SourceLocation InitLoc,
@@ -10919,67 +10916,3 @@ void Sema::CheckArgumentWithTypeTag(cons
<< ArgumentExpr->getSourceRange()
<< TypeTagExpr->getSourceRange();
}
-
-void Sema::AddPotentialMisalignedMembers(Expr *E, RecordDecl *RD, ValueDecl *MD,
- CharUnits Alignment) {
- MisalignedMembers.emplace_back(E, RD, MD, Alignment);
-}
-
-void Sema::DiagnoseMisalignedMembers() {
- for (MisalignedMember &m : MisalignedMembers) {
- Diag(m.E->getLocStart(), diag::warn_taking_address_of_packed_member)
- << m.MD << m.RD << m.E->getSourceRange();
- }
- MisalignedMembers.clear();
-}
-
-void Sema::DiscardMisalignedMemberAddress(const Type *T, Expr *E) {
- if (!T->isPointerType())
- return;
- if (isa<UnaryOperator>(E) &&
- cast<UnaryOperator>(E)->getOpcode() == UO_AddrOf) {
- auto *Op = cast<UnaryOperator>(E)->getSubExpr()->IgnoreParens();
- if (isa<MemberExpr>(Op)) {
- auto MA = std::find(MisalignedMembers.begin(), MisalignedMembers.end(),
- MisalignedMember(Op));
- if (MA != MisalignedMembers.end() &&
- Context.getTypeAlignInChars(T->getPointeeType()) <= MA->Alignment)
- MisalignedMembers.erase(MA);
- }
- }
-}
-
-void Sema::RefersToMemberWithReducedAlignment(
- Expr *E,
- std::function<void(Expr *, RecordDecl *, ValueDecl *, CharUnits)> Action) {
- const auto *ME = dyn_cast<MemberExpr>(E);
- 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>()))) {
- CharUnits Alignment = std::min(Context.getTypeAlignInChars(MD->getType()),
- Context.getTypeAlignInChars(BaseType));
- // Notify that this expression designates a member with reduced alignment
- Action(E, RD, MD, Alignment);
- break;
- }
- ME = dyn_cast<MemberExpr>(ME->getBase());
- }
-}
-
-void Sema::CheckAddressOfPackedMember(Expr *rhs) {
- using namespace std::placeholders;
- RefersToMemberWithReducedAlignment(
- rhs, std::bind(&Sema::AddPotentialMisalignedMembers, std::ref(*this), _1,
- _2, _3, _4));
-}
-
Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=275462&r1=275461&r2=275462&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExpr.cpp Thu Jul 14 15:05:30 2016
@@ -6001,9 +6001,7 @@ Sema::ActOnCastExpr(Scope *S, SourceLoca
CheckTollFreeBridgeCast(castType, CastExpr);
CheckObjCBridgeRelatedCast(castType, CastExpr);
-
- DiscardMisalignedMemberAddress(castType.getTypePtr(), CastExpr);
-
+
return BuildCStyleCastExpr(LParenLoc, castTInfo, RParenLoc, CastExpr);
}
@@ -10536,8 +10534,6 @@ QualType Sema::CheckAddressOfOperand(Exp
if (op->getType()->isObjCObjectType())
return Context.getObjCObjectPointerType(op->getType());
- CheckAddressOfPackedMember(op);
-
return Context.getPointerType(op->getType());
}
Modified: cfe/trunk/lib/Sema/SemaInit.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaInit.cpp?rev=275462&r1=275461&r2=275462&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaInit.cpp (original)
+++ cfe/trunk/lib/Sema/SemaInit.cpp Thu Jul 14 15:05:30 2016
@@ -6457,15 +6457,6 @@ InitializationSequence::Perform(Sema &S,
ExtendingEntity->getDecl());
CheckForNullPointerDereference(S, CurInit.get());
-
- S.RefersToMemberWithReducedAlignment(CurInit.get(), [&](Expr *E,
- RecordDecl *RD,
- ValueDecl *MD,
- CharUnits) {
- S.Diag(Kind.getLocation(), diag::err_binding_reference_to_packed_member)
- << MD << RD << E->getSourceRange();
- });
-
break;
case SK_BindReferenceToTemporary: {
@@ -6654,16 +6645,12 @@ InitializationSequence::Perform(Sema &S,
getAssignmentAction(Entity), CCK);
if (CurInitExprRes.isInvalid())
return ExprError();
-
- S.DiscardMisalignedMemberAddress(Step->Type.getTypePtr(), CurInit.get());
-
CurInit = CurInitExprRes;
if (Step->Kind == SK_ConversionSequenceNoNarrowing &&
S.getLangOpts().CPlusPlus && !CurInit.get()->isValueDependent())
DiagnoseNarrowingInInitList(S, *Step->ICS, SourceType, Entity.getType(),
CurInit.get());
-
break;
}
Removed: cfe/trunk/test/Sema/address-packed-member-memops.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/address-packed-member-memops.c?rev=275461&view=auto
==============================================================================
--- cfe/trunk/test/Sema/address-packed-member-memops.c (original)
+++ cfe/trunk/test/Sema/address-packed-member-memops.c (removed)
@@ -1,26 +0,0 @@
-// RUN: %clang_cc1 -fsyntax-only -verify %s
-// expected-no-diagnostics
-
-struct B {
- int x, y, z, w;
-} b;
-
-struct __attribute__((packed)) A {
- struct B b;
-} a;
-
-typedef __typeof__(sizeof(int)) size_t;
-
-void *memcpy(void *dest, const void *src, size_t n);
-int memcmp(const void *s1, const void *s2, size_t n);
-void *memmove(void *dest, const void *src, size_t n);
-void *memset(void *s, int c, size_t n);
-
-int x;
-
-void foo(void) {
- memcpy(&a.b, &b, sizeof(b));
- memmove(&a.b, &b, sizeof(b));
- memset(&a.b, 0, sizeof(b));
- x = memcmp(&a.b, &b, sizeof(b));
-}
Removed: cfe/trunk/test/Sema/address-packed.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/address-packed.c?rev=275461&view=auto
==============================================================================
--- cfe/trunk/test/Sema/address-packed.c (original)
+++ cfe/trunk/test/Sema/address-packed.c (removed)
@@ -1,160 +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 to_void(void *);
-
-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
-
- f1((int *)(void *)&arguable.x); // no-warning
- to_void(&arguable.x); // no-warning
- void *p = &arguable.x; // no-warning;
- to_void(p);
- }
- {
- union UnionArguable arguable;
- f2(&arguable.c); // no-warning
- f1(&arguable.x); // expected-warning {{packed member 'x' of class or structure 'UnionArguable'}}
-
- f1((int *)(void *)&arguable.x); // no-warning
- to_void(&arguable.x); // no-warning
- }
- {
- 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
-
- f1((int *)(void *)&arguable.x); // no-warning
- to_void(&arguable.x); // no-warning
- }
- {
- struct Arguable *arguable = get_arguable();
- f2(&arguable->c0); // no-warning
- f1(&arguable->x); // expected-warning {{packed member 'x' of class or structure 'Arguable'}}
- f2(&arguable->c1); // no-warning
-
- f1((int *)(void *)&arguable->x); // no-warning
- to_void(&arguable->c1); // no-warning
- }
- {
- ArguableT *arguable = get_arguable();
- f2(&(arguable->c0)); // no-warning
- f1(&(arguable->x)); // expected-warning {{packed member 'x' of class or structure 'Arguable'}}
- f2(&(arguable->c1)); // no-warning
-
- f1((int *)(void *)&(arguable->x)); // no-warning
- to_void(&(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)'}}
-}
-
-struct __attribute__((packed, aligned(2))) AlignedTo2 {
- int x;
-};
-
-char *g6(struct AlignedTo2 *s) {
- return (char *)&s->x; // no-warning
-}
-
-struct __attribute__((packed, aligned(2))) AlignedTo2Bis {
- int x;
-};
-
-struct AlignedTo2Bis* g7(struct AlignedTo2 *s)
-{
- return (struct AlignedTo2Bis*)&s->x; // no-warning
-}
Removed: cfe/trunk/test/SemaCXX/address-packed-member-memops.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/address-packed-member-memops.cpp?rev=275461&view=auto
==============================================================================
--- cfe/trunk/test/SemaCXX/address-packed-member-memops.cpp (original)
+++ cfe/trunk/test/SemaCXX/address-packed-member-memops.cpp (removed)
@@ -1,28 +0,0 @@
-// RUN: %clang_cc1 -fsyntax-only -verify %s
-// expected-no-diagnostics
-
-struct B {
- int x, y, z, w;
-} b;
-
-struct __attribute__((packed)) A {
- struct B b;
-} a;
-
-typedef __typeof__(sizeof(int)) size_t;
-
-extern "C" {
-void *memcpy(void *dest, const void *src, size_t n);
-int memcmp(const void *s1, const void *s2, size_t n);
-void *memmove(void *dest, const void *src, size_t n);
-void *memset(void *s, int c, size_t n);
-}
-
-int x;
-
-void foo() {
- memcpy(&a.b, &b, sizeof(b));
- memmove(&a.b, &b, sizeof(b));
- memset(&a.b, 0, sizeof(b));
- x = memcmp(&a.b, &b, sizeof(b));
-}
Removed: cfe/trunk/test/SemaCXX/address-packed.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/address-packed.cpp?rev=275461&view=auto
==============================================================================
--- cfe/trunk/test/SemaCXX/address-packed.cpp (original)
+++ cfe/trunk/test/SemaCXX/address-packed.cpp (removed)
@@ -1,118 +0,0 @@
-// RUN: %clang_cc1 -std=c++11 -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 f4(int &);
-
-void to_void(void *);
-
-template <typename... T>
-void sink(T...);
-
-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
-
- int &w = arguable.x; // expected-error {{binding reference to packed member 'x' of class or structure 'Foo::Arguable'}}
- sink(w);
- f4(arguable.x); // expected-error {{binding reference to packed member 'x' of class or structure 'Foo::Arguable'}}
-
- to_void(&arguable.x); // no-warning
- void *p1 = &arguable.x; // no-warning
- void *p2 = static_cast<void *>(&arguable.x); // no-warning
- void *p3 = reinterpret_cast<void *>(&arguable.x); // no-warning
- void *p4 = (void *)&arguable.x; // no-warning
- sink(p1, p2, p3, p4);
- }
- {
- 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