[clang] 7122b70 - [clang] Fix underlying type of EmbedExpr (#99050)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Jul 19 05:24:09 PDT 2024
Author: Mariya Podchishchaeva
Date: 2024-07-19T14:24:05+02:00
New Revision: 7122b70cfc8e23a069410215c363da76d842bda4
URL: https://github.com/llvm/llvm-project/commit/7122b70cfc8e23a069410215c363da76d842bda4
DIFF: https://github.com/llvm/llvm-project/commit/7122b70cfc8e23a069410215c363da76d842bda4.diff
LOG: [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++.
Added:
clang/test/Preprocessor/Inputs/big_char.txt
Modified:
clang/lib/AST/Expr.cpp
clang/lib/Sema/SemaInit.cpp
clang/test/Preprocessor/embed_codegen.cpp
clang/test/Preprocessor/embed_weird.cpp
Removed:
################################################################################
diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp
index 6af1b5683e08b..9d5b8167d0ee6 100644
--- a/clang/lib/AST/Expr.cpp
+++ b/clang/lib/AST/Expr.cpp
@@ -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);
diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp
index 17435afab03f4..dc2ba039afe7f 100644
--- a/clang/lib/Sema/SemaInit.cpp
+++ b/clang/lib/Sema/SemaInit.cpp
@@ -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());
diff --git a/clang/test/Preprocessor/Inputs/big_char.txt b/clang/test/Preprocessor/Inputs/big_char.txt
new file mode 100644
index 0000000000000..ce542efaa5124
--- /dev/null
+++ b/clang/test/Preprocessor/Inputs/big_char.txt
@@ -0,0 +1 @@
+ΓΏ
\ No newline at end of file
diff --git a/clang/test/Preprocessor/embed_codegen.cpp b/clang/test/Preprocessor/embed_codegen.cpp
index 2cf14d8d6a15d..5baab9b59a9c1 100644
--- a/clang/test/Preprocessor/embed_codegen.cpp
+++ b/clang/test/Preprocessor/embed_codegen.cpp
@@ -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(,)
diff --git a/clang/test/Preprocessor/embed_weird.cpp b/clang/test/Preprocessor/embed_weird.cpp
index cc73a88e5a657..6eb2923152f15 100644
--- a/clang/test/Preprocessor/embed_weird.cpp
+++ b/clang/test/Preprocessor/embed_weird.cpp
@@ -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'}}
+
+};
More information about the cfe-commits
mailing list