summaryrefslogtreecommitdiffstats
path: root/clang/lib/AST/Expr.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2010-01-29 19:14:02 +0000
committerDouglas Gregor <dgregor@apple.com>2010-01-29 19:14:02 +0000
commit65eb86e91252791cea630e6ebcae8a5099aa24cf (patch)
treeca2793fc194e63fccb23ffd77c1b4fe1b4a98add /clang/lib/AST/Expr.cpp
parent9fb8ce835d80337669f24fe7f567da015639d84f (diff)
downloadbcm5719-llvm-65eb86e91252791cea630e6ebcae8a5099aa24cf.tar.gz
bcm5719-llvm-65eb86e91252791cea630e6ebcae8a5099aa24cf.zip
Fix reference binding of const lvalue references to bit-fields, which
requires a temporary. Previously, we were building an initialization sequence that bound to the bit-field as if it were a real lvalue. Note that we previously (and still) diagnose binding of non-const references to bit-fields, as we should. There's no real way to test that this code is correct, since reference binding does not *currently* have any representation in the AST. This fix should make it easier for that to happen, so I've verified this fix with... Added InitializationSequence::dump(), to print an initialization sequence for debugging purposes. llvm-svn: 94826
Diffstat (limited to 'clang/lib/AST/Expr.cpp')
-rw-r--r--clang/lib/AST/Expr.cpp7
1 files changed, 7 insertions, 0 deletions
diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp
index 4e05a850270..66f06e090af 100644
--- a/clang/lib/AST/Expr.cpp
+++ b/clang/lib/AST/Expr.cpp
@@ -1958,6 +1958,13 @@ bool Expr::isNullPointerConstant(ASTContext &Ctx,
FieldDecl *Expr::getBitField() {
Expr *E = this->IgnoreParens();
+ while (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) {
+ if (ICE->isLvalueCast() && ICE->getCastKind() == CastExpr::CK_NoOp)
+ E = ICE->getSubExpr()->IgnoreParens();
+ else
+ break;
+ }
+
if (MemberExpr *MemRef = dyn_cast<MemberExpr>(E))
if (FieldDecl *Field = dyn_cast<FieldDecl>(MemRef->getMemberDecl()))
if (Field->isBitField())
OpenPOWER on IntegriCloud