Index: clang/lib/CodeGen/CGExprConstant.cpp =================================================================== --- clang/lib/CodeGen/CGExprConstant.cpp +++ clang/lib/CodeGen/CGExprConstant.cpp @@ -2108,8 +2108,7 @@ case APValue::Union: return ConstStructBuilder::BuildStruct(*this, Value, DestType); case APValue::Array: { - const ConstantArrayType *CAT = - CGM.getContext().getAsConstantArrayType(DestType); + const ArrayType *ArrayTy = CGM.getContext().getAsArrayType(DestType); unsigned NumElements = Value.getArraySize(); unsigned NumInitElts = Value.getArrayInitializedElts(); @@ -2117,7 +2116,7 @@ llvm::Constant *Filler = nullptr; if (Value.hasArrayFiller()) { Filler = tryEmitAbstractForMemory(Value.getArrayFiller(), - CAT->getElementType()); + ArrayTy->getElementType()); if (!Filler) return nullptr; } @@ -2132,7 +2131,7 @@ llvm::Type *CommonElementType = nullptr; for (unsigned I = 0; I < NumInitElts; ++I) { llvm::Constant *C = tryEmitPrivateForMemory( - Value.getArrayInitializedElt(I), CAT->getElementType()); + Value.getArrayInitializedElt(I), ArrayTy->getElementType()); if (!C) return nullptr; if (I == 0) @@ -2144,11 +2143,10 @@ // This means that the array type is probably "IncompleteType" or some // type that is not ConstantArray. - if (CAT == nullptr && CommonElementType == nullptr && !NumInitElts) { - const ArrayType *AT = CGM.getContext().getAsArrayType(DestType); - CommonElementType = CGM.getTypes().ConvertType(AT->getElementType()); - llvm::ArrayType *AType = llvm::ArrayType::get(CommonElementType, - NumElements); + if (!Filler && !NumInitElts) { + CommonElementType = CGM.getTypes().ConvertType(ArrayTy->getElementType()); + llvm::ArrayType *AType = + llvm::ArrayType::get(CommonElementType, NumElements); return llvm::ConstantAggregateZero::get(AType); } Index: clang/test/CodeGenCXX/pr47636.cpp =================================================================== --- /dev/null +++ clang/test/CodeGenCXX/pr47636.cpp @@ -0,0 +1,10 @@ +// RUN: %clang_cc1 -o - -emit-llvm -triple x86_64-linux-pc %s | FileCheck %s +int(&&intu_rvref)[] {1,2,3,4}; +// CHECK: @_ZGR10intu_rvref_ = internal global [4 x i32] [i32 1, i32 2, i32 3, i32 4] +// CHECK: @intu_rvref = constant [4 x i32]* @_ZGR10intu_rvref_ + +void foo() { + static const int(&&intu_rvref)[] {1,2,3,4}; + // CHECK: @_ZZ3foovE10intu_rvref = internal constant [4 x i32]* @_ZGRZ3foovE10intu_rvref_ + // CHECK: @_ZGRZ3foovE10intu_rvref_ = internal constant [4 x i32] [i32 1, i32 2, i32 3, i32 4] +}