diff options
Diffstat (limited to 'lib/CodeGen/CGExprConstant.cpp')
| -rw-r--r-- | lib/CodeGen/CGExprConstant.cpp | 20 | 
1 files changed, 10 insertions, 10 deletions
| diff --git a/lib/CodeGen/CGExprConstant.cpp b/lib/CodeGen/CGExprConstant.cpp index 54f7eee6791e..73ca0cc1c3d5 100644 --- a/lib/CodeGen/CGExprConstant.cpp +++ b/lib/CodeGen/CGExprConstant.cpp @@ -383,14 +383,19 @@ bool ConstStructBuilder::Build(InitListExpr *ILE) {      if (!EltInit)        return false; -     +      if (!Field->isBitField()) {        // Handle non-bitfield members.        AppendField(*Field, Layout.getFieldOffset(FieldNo), EltInit);      } else {        // Otherwise we have a bitfield. -      AppendBitField(*Field, Layout.getFieldOffset(FieldNo), -                     cast<llvm::ConstantInt>(EltInit)); +      if (auto *CI = dyn_cast<llvm::ConstantInt>(EltInit)) { +        AppendBitField(*Field, Layout.getFieldOffset(FieldNo), CI); +      } else { +        // We are trying to initialize a bitfield with a non-trivial constant, +        // this must require run-time code. +        return false; +      }      }    } @@ -1110,7 +1115,7 @@ llvm::Constant *CodeGenModule::EmitConstantValue(const APValue &Value,          unsigned AS = C->getType()->getPointerAddressSpace();          llvm::Type *CharPtrTy = Int8Ty->getPointerTo(AS);          llvm::Constant *Casted = llvm::ConstantExpr::getBitCast(C, CharPtrTy); -        Casted = llvm::ConstantExpr::getGetElementPtr(Casted, Offset); +        Casted = llvm::ConstantExpr::getGetElementPtr(Int8Ty, Casted, Offset);          C = llvm::ConstantExpr::getPointerCast(Casted, C->getType());        } @@ -1403,10 +1408,6 @@ llvm::Constant *CodeGenModule::EmitNullConstant(QualType T) {      llvm::Constant *Element = EmitNullConstant(ElementTy);      unsigned NumElements = CAT->getSize().getZExtValue(); -     -    if (Element->isNullValue()) -      return llvm::ConstantAggregateZero::get(ATy); -          SmallVector<llvm::Constant *, 8> Array(NumElements, Element);      return llvm::ConstantArray::get(ATy, Array);    } @@ -1416,8 +1417,7 @@ llvm::Constant *CodeGenModule::EmitNullConstant(QualType T) {      return ::EmitNullConstant(*this, RD, /*complete object*/ true);    } -  assert(T->isMemberPointerType() && "Should only see member pointers here!"); -  assert(!T->getAs<MemberPointerType>()->getPointeeType()->isFunctionType() && +  assert(T->isMemberDataPointerType() &&           "Should only see pointers to data members here!");    return getCXXABI().EmitNullMemberPointer(T->castAs<MemberPointerType>()); | 
