[PATCH] D27263: Address of bitfield in anonymous struct doesn't error.

2017-04-13 Thread Richard Smith via Phabricator via cfe-commits
rsmith added a comment.

The change to test/SemaCXX/anonymous-struct.cpp appeared to be unrelated to the 
rest of the patch, so I committed it separately as r300266.

Thank you!


Repository:
  rL LLVM

https://reviews.llvm.org/D27263



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D27263: Address of bitfield in anonymous struct doesn't error.

2017-04-13 Thread Richard Smith via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rL300264: Diagnose attempt to take address of bitfield members 
in anonymous structs. (authored by rsmith).

Changed prior to commit:
  https://reviews.llvm.org/D27263?vs=79759=95222#toc

Repository:
  rL LLVM

https://reviews.llvm.org/D27263

Files:
  cfe/trunk/lib/Sema/SemaExpr.cpp
  cfe/trunk/test/Sema/expr-address-of.c
  cfe/trunk/test/SemaCXX/ptrtomember.cpp


Index: cfe/trunk/test/SemaCXX/ptrtomember.cpp
===
--- cfe/trunk/test/SemaCXX/ptrtomember.cpp
+++ cfe/trunk/test/SemaCXX/ptrtomember.cpp
@@ -13,9 +13,13 @@
 
 struct S2 {
   int bitfield : 1;
+  struct {
+int anon_bitfield : 1;
+  };
 };
 
 int S2::*pf = ::bitfield; // expected-error {{address of bit-field 
requested}}
+int S2::*anon_pf = ::anon_bitfield; // expected-error {{address of 
bit-field requested}}
 
 struct S3 {
   void m();
Index: cfe/trunk/test/Sema/expr-address-of.c
===
--- cfe/trunk/test/Sema/expr-address-of.c
+++ cfe/trunk/test/Sema/expr-address-of.c
@@ -102,8 +102,9 @@
   register struct {char* x;} t1 = {"Hello"};
   char* dummy1 = &(t1.x[0]);
 
-  struct {int a : 10;} t2;
+  struct {int a : 10; struct{int b : 10;};} t2;
   int* dummy2 = &(t2.a); // expected-error {{address of bit-field requested}}
+  int* dummy3 = &(t2.b); // expected-error {{address of bit-field requested}}
 
   void* t3 = &(*(void*)0);
 }
Index: cfe/trunk/lib/Sema/SemaExpr.cpp
===
--- cfe/trunk/lib/Sema/SemaExpr.cpp
+++ cfe/trunk/lib/Sema/SemaExpr.cpp
@@ -1772,7 +1772,10 @@
   !Diags.isIgnored(diag::warn_arc_repeated_use_of_weak, E->getLocStart()))
   recordUseOfEvaluatedWeak(E);
 
-  if (FieldDecl *FD = dyn_cast(D)) {
+  FieldDecl *FD = dyn_cast(D);
+  if (IndirectFieldDecl *IFD = dyn_cast(D))
+FD = IFD->getAnonField();
+  if (FD) {
 UnusedPrivateFields.remove(FD);
 // Just in case we're building an illegal pointer-to-member.
 if (FD->isBitField())


Index: cfe/trunk/test/SemaCXX/ptrtomember.cpp
===
--- cfe/trunk/test/SemaCXX/ptrtomember.cpp
+++ cfe/trunk/test/SemaCXX/ptrtomember.cpp
@@ -13,9 +13,13 @@
 
 struct S2 {
   int bitfield : 1;
+  struct {
+int anon_bitfield : 1;
+  };
 };
 
 int S2::*pf = ::bitfield; // expected-error {{address of bit-field requested}}
+int S2::*anon_pf = ::anon_bitfield; // expected-error {{address of bit-field requested}}
 
 struct S3 {
   void m();
Index: cfe/trunk/test/Sema/expr-address-of.c
===
--- cfe/trunk/test/Sema/expr-address-of.c
+++ cfe/trunk/test/Sema/expr-address-of.c
@@ -102,8 +102,9 @@
   register struct {char* x;} t1 = {"Hello"};
   char* dummy1 = &(t1.x[0]);
 
-  struct {int a : 10;} t2;
+  struct {int a : 10; struct{int b : 10;};} t2;
   int* dummy2 = &(t2.a); // expected-error {{address of bit-field requested}}
+  int* dummy3 = &(t2.b); // expected-error {{address of bit-field requested}}
 
   void* t3 = &(*(void*)0);
 }
Index: cfe/trunk/lib/Sema/SemaExpr.cpp
===
--- cfe/trunk/lib/Sema/SemaExpr.cpp
+++ cfe/trunk/lib/Sema/SemaExpr.cpp
@@ -1772,7 +1772,10 @@
   !Diags.isIgnored(diag::warn_arc_repeated_use_of_weak, E->getLocStart()))
   recordUseOfEvaluatedWeak(E);
 
-  if (FieldDecl *FD = dyn_cast(D)) {
+  FieldDecl *FD = dyn_cast(D);
+  if (IndirectFieldDecl *IFD = dyn_cast(D))
+FD = IFD->getAnonField();
+  if (FD) {
 UnusedPrivateFields.remove(FD);
 // Just in case we're building an illegal pointer-to-member.
 if (FD->isBitField())
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D27263: Address of bitfield in anonymous struct doesn't error.

2017-04-13 Thread Jacob Young via Phabricator via cfe-commits
jacobly added a comment.

Ping.


https://reviews.llvm.org/D27263



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D27263: Address of bitfield in anonymous struct doesn't error.

2016-12-15 Thread Jacob Young via Phabricator via cfe-commits
jacobly added a comment.

rsmith, is this ready to be commited?


https://reviews.llvm.org/D27263



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D27263: Address of bitfield in anonymous struct doesn't error.

2016-11-30 Thread Jacob Young via Phabricator via cfe-commits
jacobly created this revision.
jacobly added a subscriber: cfe-commits.

  struct A {
struct {
  int B : 1;
}
  }
  int A::*addr_anon_bitfield() {
  return ::B;
  }

This code does not error, but instead returns a member pointer to a full int 
that starts at the beginning of the byte the bitfield starts on.


https://reviews.llvm.org/D27263

Files:
  /home/jacob/Source/llvm/tools/clang/lib/Sema/SemaExpr.cpp
  /home/jacob/Source/llvm/tools/clang/test/Sema/expr-address-of.c
  /home/jacob/Source/llvm/tools/clang/test/SemaCXX/anonymous-struct.cpp
  /home/jacob/Source/llvm/tools/clang/test/SemaCXX/ptrtomember.cpp


Index: /home/jacob/Source/llvm/tools/clang/test/SemaCXX/ptrtomember.cpp
===
--- /home/jacob/Source/llvm/tools/clang/test/SemaCXX/ptrtomember.cpp
+++ /home/jacob/Source/llvm/tools/clang/test/SemaCXX/ptrtomember.cpp
@@ -13,9 +13,13 @@
 
 struct S2 {
   int bitfield : 1;
+  struct {
+int anon_bitfield : 1;
+  };
 };
 
 int S2::*pf = ::bitfield; // expected-error {{address of bit-field 
requested}}
+int S2::*anon_pf = ::anon_bitfield; // expected-error {{address of 
bit-field requested}}
 
 struct S3 {
   void m();
Index: /home/jacob/Source/llvm/tools/clang/test/SemaCXX/anonymous-struct.cpp
===
--- /home/jacob/Source/llvm/tools/clang/test/SemaCXX/anonymous-struct.cpp
+++ /home/jacob/Source/llvm/tools/clang/test/SemaCXX/anonymous-struct.cpp
@@ -21,6 +21,9 @@
   };
   static struct {
   };
+  class {
+int anon_priv_field; // expected-error {{anonymous struct cannot contain a 
private data member}}
+  };
 };
 
 template  void foo(T);
Index: /home/jacob/Source/llvm/tools/clang/test/Sema/expr-address-of.c
===
--- /home/jacob/Source/llvm/tools/clang/test/Sema/expr-address-of.c
+++ /home/jacob/Source/llvm/tools/clang/test/Sema/expr-address-of.c
@@ -102,8 +102,9 @@
   register struct {char* x;} t1 = {"Hello"};
   char* dummy1 = &(t1.x[0]);
 
-  struct {int a : 10;} t2;
+  struct {int a : 10; struct{int b : 10;};} t2;
   int* dummy2 = &(t2.a); // expected-error {{address of bit-field requested}}
+  int* dummy3 = &(t2.b); // expected-error {{address of bit-field requested}}
 
   void* t3 = &(*(void*)0);
 }
Index: /home/jacob/Source/llvm/tools/clang/lib/Sema/SemaExpr.cpp
===
--- /home/jacob/Source/llvm/tools/clang/lib/Sema/SemaExpr.cpp
+++ /home/jacob/Source/llvm/tools/clang/lib/Sema/SemaExpr.cpp
@@ -1762,7 +1762,10 @@
   !Diags.isIgnored(diag::warn_arc_repeated_use_of_weak, E->getLocStart()))
   recordUseOfEvaluatedWeak(E);
 
-  if (FieldDecl *FD = dyn_cast(D)) {
+  FieldDecl *FD = dyn_cast(D);
+  if (IndirectFieldDecl *IFD = dyn_cast(D))
+FD = IFD->getAnonField();
+  if (FD) {
 UnusedPrivateFields.remove(FD);
 // Just in case we're building an illegal pointer-to-member.
 if (FD->isBitField())


Index: /home/jacob/Source/llvm/tools/clang/test/SemaCXX/ptrtomember.cpp
===
--- /home/jacob/Source/llvm/tools/clang/test/SemaCXX/ptrtomember.cpp
+++ /home/jacob/Source/llvm/tools/clang/test/SemaCXX/ptrtomember.cpp
@@ -13,9 +13,13 @@
 
 struct S2 {
   int bitfield : 1;
+  struct {
+int anon_bitfield : 1;
+  };
 };
 
 int S2::*pf = ::bitfield; // expected-error {{address of bit-field requested}}
+int S2::*anon_pf = ::anon_bitfield; // expected-error {{address of bit-field requested}}
 
 struct S3 {
   void m();
Index: /home/jacob/Source/llvm/tools/clang/test/SemaCXX/anonymous-struct.cpp
===
--- /home/jacob/Source/llvm/tools/clang/test/SemaCXX/anonymous-struct.cpp
+++ /home/jacob/Source/llvm/tools/clang/test/SemaCXX/anonymous-struct.cpp
@@ -21,6 +21,9 @@
   };
   static struct {
   };
+  class {
+int anon_priv_field; // expected-error {{anonymous struct cannot contain a private data member}}
+  };
 };
 
 template  void foo(T);
Index: /home/jacob/Source/llvm/tools/clang/test/Sema/expr-address-of.c
===
--- /home/jacob/Source/llvm/tools/clang/test/Sema/expr-address-of.c
+++ /home/jacob/Source/llvm/tools/clang/test/Sema/expr-address-of.c
@@ -102,8 +102,9 @@
   register struct {char* x;} t1 = {"Hello"};
   char* dummy1 = &(t1.x[0]);
 
-  struct {int a : 10;} t2;
+  struct {int a : 10; struct{int b : 10;};} t2;
   int* dummy2 = &(t2.a); // expected-error {{address of bit-field requested}}
+  int* dummy3 = &(t2.b); // expected-error {{address of bit-field requested}}
 
   void* t3 = &(*(void*)0);
 }
Index: /home/jacob/Source/llvm/tools/clang/lib/Sema/SemaExpr.cpp
===
--- /home/jacob/Source/llvm/tools/clang/lib/Sema/SemaExpr.cpp
+++