diff options
| -rw-r--r-- | clang/lib/AST/ExprConstant.cpp | 7 | ||||
| -rw-r--r-- | clang/lib/CodeGen/CGExpr.cpp | 2 | ||||
| -rw-r--r-- | clang/test/CodeGenCXX/reference-field.cpp | 6 | 
3 files changed, 13 insertions, 2 deletions
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index 4ad2bec53bc..50fdcfd6eb2 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -231,7 +231,10 @@ APValue LValueExprEvaluator::VisitMemberExpr(MemberExpr *E) {    FieldDecl *FD = dyn_cast<FieldDecl>(E->getMemberDecl());    if (!FD) // FIXME: deal with other kinds of member expressions      return APValue(); -     + +  if (FD->getType()->isReferenceType()) +    return APValue(); +    // FIXME: This is linear time.    unsigned i = 0;    for (RecordDecl::field_iterator Field = RD->field_begin(Info.Ctx), @@ -1047,7 +1050,7 @@ unsigned IntExprEvaluator::GetAlignOfType(QualType T) {    // Get information about the alignment.    unsigned CharSize = Info.Ctx.Target.getCharWidth(); -  // FIXME: Why do we ask for the preferred alignment? +  // __alignof is defined to return the preferred alignment.    return Info.Ctx.getPreferredTypeAlign(T.getTypePtr()) / CharSize;  } diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp index 3d07403b07f..12a8002de31 100644 --- a/clang/lib/CodeGen/CGExpr.cpp +++ b/clang/lib/CodeGen/CGExpr.cpp @@ -1034,6 +1034,8 @@ LValue CodeGenFunction::EmitLValueForField(llvm::Value* BaseValue,                                llvm::PointerType::get(FieldTy, AS),                                 "tmp");    } +  if (Field->getType()->isReferenceType()) +    V = Builder.CreateLoad(V, "tmp");    QualType::GCAttrTypes attr = QualType::GCNone;    if (CGM.getLangOptions().ObjC1 && diff --git a/clang/test/CodeGenCXX/reference-field.cpp b/clang/test/CodeGenCXX/reference-field.cpp new file mode 100644 index 00000000000..88d4c1f37e6 --- /dev/null +++ b/clang/test/CodeGenCXX/reference-field.cpp @@ -0,0 +1,6 @@ +// RUN: clang-cc -emit-llvm -o - %s -O2 | grep "@_Z1bv" + +// Make sure the call to b() doesn't get optimized out. +extern struct x {char& x,y;}y; +int b();       +int a() { if (!&y.x) b(); }  | 

