summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2017-04-13 21:49:46 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2017-04-13 21:49:46 +0000
commitcf681266e611d030258d5a801d2bb03ba3095692 (patch)
treeb2f33331e1acd14f59f1b21adfea5413bc0f07ec
parent3e1fc3f6fe2db16c531ea09983fdd8f59e6f89ba (diff)
downloadbcm5719-llvm-cf681266e611d030258d5a801d2bb03ba3095692.tar.gz
bcm5719-llvm-cf681266e611d030258d5a801d2bb03ba3095692.zip
Diagnose attempt to take address of bitfield members in anonymous structs.
Patch by Jacob Young! Differential Revision: https://reviews.llvm.org/D27263 llvm-svn: 300264
-rw-r--r--clang/lib/Sema/SemaExpr.cpp5
-rw-r--r--clang/test/Sema/expr-address-of.c3
-rw-r--r--clang/test/SemaCXX/ptrtomember.cpp4
3 files changed, 10 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index 73baf1a660f..bb174521c72 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -1772,7 +1772,10 @@ Sema::BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK,
!Diags.isIgnored(diag::warn_arc_repeated_use_of_weak, E->getLocStart()))
recordUseOfEvaluatedWeak(E);
- if (FieldDecl *FD = dyn_cast<FieldDecl>(D)) {
+ FieldDecl *FD = dyn_cast<FieldDecl>(D);
+ if (IndirectFieldDecl *IFD = dyn_cast<IndirectFieldDecl>(D))
+ FD = IFD->getAnonField();
+ if (FD) {
UnusedPrivateFields.remove(FD);
// Just in case we're building an illegal pointer-to-member.
if (FD->isBitField())
diff --git a/clang/test/Sema/expr-address-of.c b/clang/test/Sema/expr-address-of.c
index 32bd0dfdd5b..480871afad2 100644
--- a/clang/test/Sema/expr-address-of.c
+++ b/clang/test/Sema/expr-address-of.c
@@ -102,8 +102,9 @@ char* f7() {
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);
}
diff --git a/clang/test/SemaCXX/ptrtomember.cpp b/clang/test/SemaCXX/ptrtomember.cpp
index aee535e5593..d4a4507d02a 100644
--- a/clang/test/SemaCXX/ptrtomember.cpp
+++ b/clang/test/SemaCXX/ptrtomember.cpp
@@ -13,9 +13,13 @@ int foo(int S::* ps, S *s)
struct S2 {
int bitfield : 1;
+ struct {
+ int anon_bitfield : 1;
+ };
};
int S2::*pf = &S2::bitfield; // expected-error {{address of bit-field requested}}
+int S2::*anon_pf = &S2::anon_bitfield; // expected-error {{address of bit-field requested}}
struct S3 {
void m();
OpenPOWER on IntegriCloud