From 0f6facca9701f6df87d13e55d70bd7111a0472aa Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Mon, 21 Sep 2020 14:52:06 -0700 Subject: [PATCH] Don't build a StringLiteral expression with reference type when performing list-initialization of a char array reference from a braced string literal of a smaller size. --- clang/lib/Sema/SemaInit.cpp | 3 ++- clang/test/CodeGenCXX/cxx0x-initializer-references.cpp | 9 +++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp index ab82f85..a9f707b 100644 --- a/clang/lib/Sema/SemaInit.cpp +++ b/clang/lib/Sema/SemaInit.cpp @@ -8420,7 +8420,8 @@ ExprResult InitializationSequence::Perform(Sema &S, case SK_StringInit: { QualType Ty = Step->Type; - CheckStringInit(CurInit.get(), ResultType ? *ResultType : Ty, + bool UpdateType = ResultType && Entity.getType()->isIncompleteArrayType(); + CheckStringInit(CurInit.get(), UpdateType ? *ResultType : Ty, S.Context.getAsArrayType(Ty), S); break; } diff --git a/clang/test/CodeGenCXX/cxx0x-initializer-references.cpp b/clang/test/CodeGenCXX/cxx0x-initializer-references.cpp index 595d27c..00273ed 100644 --- a/clang/test/CodeGenCXX/cxx0x-initializer-references.cpp +++ b/clang/test/CodeGenCXX/cxx0x-initializer-references.cpp @@ -1,5 +1,14 @@ // RUN: %clang_cc1 -std=c++11 -S -triple armv7-none-eabi -fmerge-all-constants -emit-llvm -o - %s | FileCheck %s +// This creates and lifetime-extends a 'const char[5]' temporary. +// CHECK: @_ZGR19extended_string_ref_ = internal constant [5 x i8] c"hi\00\00\00", +// CHECK: @extended_string_ref = constant [5 x i8]* @_ZGR19extended_string_ref_, +const char (&extended_string_ref)[5] = {"hi"}; + +// This binds directly to a string literal object. +// CHECK: @nonextended_string_ref = constant [3 x i8]* @.str +const char (&nonextended_string_ref)[3] = {"hi"}; + namespace reference { struct A { int i1, i2; -- 2.7.4