diff options
author | Nick Desaulniers <nickdesaulniers@users.noreply.github.com> | 2023-10-30 08:48:31 -0700 |
---|---|---|
committer | Tobias Hieta <tobias@hieta.se> | 2023-11-13 08:18:27 +0100 |
commit | 582f0469dae1d2ca946a38d05a55e60521ccafe4 (patch) | |
tree | 333df2e51be5725ddd14bc7b318f1e17cea6d25d | |
parent | 309d55140c46384b6de7a7573206cbeba3f7077f (diff) | |
download | llvm-582f0469dae1d2ca946a38d05a55e60521ccafe4.tar.gz llvm-582f0469dae1d2ca946a38d05a55e60521ccafe4.tar.bz2 llvm-582f0469dae1d2ca946a38d05a55e60521ccafe4.zip |
[CGExprConstant] stop calling into ConstExprEmitter for Reference type destinations (#70366)
Fixes a bug introduced by
commit b54294e2c959 ("[clang][ConstantEmitter] have
tryEmitPrivate[ForVarInit] try ConstExprEmitter fast-path first")
In the added test case, the QualType is a LValueReferenceType.
LValueReferenceType 0x558412998d90 'const char (&)[41]'
`-ParenType 0x558412998d30 'const char[41]' sugar
`-ConstantArrayType 0x558412998cf0 'const char[41]' 41
`-QualType 0x55841294c271 'const char' const
`-BuiltinType 0x55841294c270 'char'
Fixes: #69979
(cherry picked from commit d9b15b068d19089f72fc0d7dc59ed1d6d77125dc)
-rw-r--r-- | clang/lib/CodeGen/CGExprConstant.cpp | 7 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/const-init-cxx11.cpp | 6 |
2 files changed, 10 insertions, 3 deletions
diff --git a/clang/lib/CodeGen/CGExprConstant.cpp b/clang/lib/CodeGen/CGExprConstant.cpp index 942daa4aa577..91369b7d8804 100644 --- a/clang/lib/CodeGen/CGExprConstant.cpp +++ b/clang/lib/CodeGen/CGExprConstant.cpp @@ -1736,9 +1736,10 @@ llvm::Constant *ConstantEmitter::tryEmitPrivate(const Expr *E, QualType destType) { assert(!destType->isVoidType() && "can't emit a void constant"); - if (llvm::Constant *C = - ConstExprEmitter(*this).Visit(const_cast<Expr *>(E), destType)) - return C; + if (!destType->isReferenceType()) + if (llvm::Constant *C = + ConstExprEmitter(*this).Visit(const_cast<Expr *>(E), destType)) + return C; Expr::EvalResult Result; diff --git a/clang/test/CodeGenCXX/const-init-cxx11.cpp b/clang/test/CodeGenCXX/const-init-cxx11.cpp index d22d78d2b94e..3a12fe444f13 100644 --- a/clang/test/CodeGenCXX/const-init-cxx11.cpp +++ b/clang/test/CodeGenCXX/const-init-cxx11.cpp @@ -424,6 +424,8 @@ namespace DR2126 { // CHECK: @_ZN33ClassTemplateWithStaticDataMember3useE ={{.*}} constant ptr @_ZGRN33ClassTemplateWithStaticDataMember1SIvE1aE_ // CHECK: @_ZGRN39ClassTemplateWithHiddenStaticDataMember1SIvE1aE_ = linkonce_odr hidden constant i32 5, comdat // CHECK: @_ZN39ClassTemplateWithHiddenStaticDataMember3useE ={{.*}} constant ptr @_ZGRN39ClassTemplateWithHiddenStaticDataMember1SIvE1aE_ +// CHECK: @.str.[[STR:[0-9]+]] ={{.*}} constant [9 x i8] c"12345678\00" +// CHECK-NEXT: @e = global %struct.PR69979 { ptr @.str.[[STR]] } // CHECK: @_ZGRZN20InlineStaticConstRef3funEvE1i_ = linkonce_odr constant i32 10, comdat // CHECK20: @_ZZN12LocalVarInit4dtorEvE1a = internal constant {{.*}} i32 103 @@ -632,6 +634,10 @@ struct X { const char *f() { return &X::p; } } +struct PR69979 { + const char (&d)[9]; +} e {"12345678"}; + // VirtualMembers::TemplateClass::templateMethod() must be defined in this TU, // not just declared. // CHECK: define linkonce_odr void @_ZN14VirtualMembers13TemplateClassIiE14templateMethodEv(ptr {{[^,]*}} %this) |