[clang] Fix underlying type of EmbedExpr (#99050)
This patch makes remaining cases of #embed to emit int type since there is an agreement to do that for C. C++ is being discussed, but in general we don't want to produce different types for C and C++.
This commit is contained in:
parent
7b60f2dcfb
commit
7122b70cfc
@ -2376,7 +2376,7 @@ APValue SourceLocExpr::EvaluateInContext(const ASTContext &Ctx,
|
||||
EmbedExpr::EmbedExpr(const ASTContext &Ctx, SourceLocation Loc,
|
||||
EmbedDataStorage *Data, unsigned Begin,
|
||||
unsigned NumOfElements)
|
||||
: Expr(EmbedExprClass, Ctx.UnsignedCharTy, VK_PRValue, OK_Ordinary),
|
||||
: Expr(EmbedExprClass, Ctx.IntTy, VK_PRValue, OK_Ordinary),
|
||||
EmbedKeywordLoc(Loc), Ctx(&Ctx), Data(Data), Begin(Begin),
|
||||
NumOfElements(NumOfElements) {
|
||||
setDependence(ExprDependence::None);
|
||||
|
@ -2016,7 +2016,7 @@ canInitializeArrayWithEmbedDataString(ArrayRef<Expr *> ExprList,
|
||||
if (InitType->isArrayType()) {
|
||||
const ArrayType *InitArrayType = InitType->getAsArrayTypeUnsafe();
|
||||
QualType InitElementTy = InitArrayType->getElementType();
|
||||
QualType EmbedExprElementTy = EE->getType();
|
||||
QualType EmbedExprElementTy = EE->getDataStringLiteral()->getType();
|
||||
const bool TypesMatch =
|
||||
Context.typesAreCompatible(InitElementTy, EmbedExprElementTy) ||
|
||||
(InitElementTy->isCharType() && EmbedExprElementTy->isCharType());
|
||||
|
1
clang/test/Preprocessor/Inputs/big_char.txt
Normal file
1
clang/test/Preprocessor/Inputs/big_char.txt
Normal file
@ -0,0 +1 @@
|
||||
<EFBFBD>
|
@ -14,9 +14,9 @@ int ca[] = {
|
||||
};
|
||||
|
||||
// CHECK: %arrayinit.element = getelementptr inbounds i32, ptr %notca, i64 1
|
||||
// CHECK: store i8 106, ptr %arrayinit.element, align 4
|
||||
// CHECK: store i32 106, ptr %arrayinit.element, align 4
|
||||
// CHECK: %arrayinit.element1 = getelementptr inbounds i32, ptr %notca, i64 2
|
||||
// CHECK: store i8 107, ptr %arrayinit.element1, align 4
|
||||
// CHECK: store i32 107, ptr %arrayinit.element1, align 4
|
||||
int notca[] = {
|
||||
a
|
||||
#embed <jk.txt> prefix(,)
|
||||
@ -75,9 +75,9 @@ constexpr struct T t[] = {
|
||||
// CHECK: %arrayinit.element7 = getelementptr inbounds %struct.T, ptr %tnonc, i64 1
|
||||
// CHECK: call void @llvm.memset.p0.i64(ptr align 4 %arrayinit.element7, i8 0, i64 20, i1 false)
|
||||
// CHECK: %arr8 = getelementptr inbounds %struct.T, ptr %arrayinit.element7, i32 0, i32 0
|
||||
// CHECK: store i8 106, ptr %arr8, align 4
|
||||
// CHECK: store i32 106, ptr %arr8, align 4
|
||||
// CHECK: %arrayinit.element9 = getelementptr inbounds i32, ptr %arr8, i64 1
|
||||
// CHECK: store i8 107, ptr %arrayinit.element9, align 4
|
||||
// CHECK: store i32 107, ptr %arrayinit.element9, align 4
|
||||
struct T tnonc[] = {
|
||||
a, 300, 1, 2, 3
|
||||
#embed <jk.txt> prefix(,)
|
||||
|
@ -115,3 +115,14 @@ void f1() {
|
||||
};
|
||||
}
|
||||
#endif
|
||||
|
||||
struct HasChar {
|
||||
signed char ch;
|
||||
};
|
||||
|
||||
constexpr struct HasChar c = {
|
||||
#embed "Inputs/big_char.txt" // cxx-error {{constant expression evaluates to 255 which cannot be narrowed to type 'signed char'}} \
|
||||
cxx-note {{insert an explicit cast to silence this issue}} \
|
||||
c-error {{constexpr initializer evaluates to 255 which is not exactly representable in type 'signed char'}}
|
||||
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user