[PATCH] D27263: Address of bitfield in anonymous struct doesn't error.
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.
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.
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.
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.
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 +++