[clang] [clang][bytecode] Use PredefinedExpr as base for its variable (PR #111956)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Oct 11 00:09:44 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Timm Baeder (tbaederr)
<details>
<summary>Changes</summary>
This fixes the error message generated.
---
Full diff: https://github.com/llvm/llvm-project/pull/111956.diff
4 Files Affected:
- (modified) clang/lib/AST/ByteCode/Compiler.cpp (+5)
- (modified) clang/lib/AST/ByteCode/Program.cpp (+9-6)
- (modified) clang/lib/AST/ByteCode/Program.h (+2-1)
- (modified) clang/test/AST/ByteCode/cxx1z.cpp (+4)
``````````diff
diff --git a/clang/lib/AST/ByteCode/Compiler.cpp b/clang/lib/AST/ByteCode/Compiler.cpp
index 0a3b38b0dc6e57..b2663714340b93 100644
--- a/clang/lib/AST/ByteCode/Compiler.cpp
+++ b/clang/lib/AST/ByteCode/Compiler.cpp
@@ -2869,6 +2869,11 @@ bool Compiler<Emitter>::VisitPredefinedExpr(const PredefinedExpr *E) {
if (DiscardResult)
return true;
+ if (!Initializing) {
+ unsigned StringIndex = P.createGlobalString(E->getFunctionName(), E);
+ return this->emitGetPtrGlobal(StringIndex, E);
+ }
+
return this->delegate(E->getFunctionName());
}
diff --git a/clang/lib/AST/ByteCode/Program.cpp b/clang/lib/AST/ByteCode/Program.cpp
index 23245a66b578ae..cd2665f755d7cb 100644
--- a/clang/lib/AST/ByteCode/Program.cpp
+++ b/clang/lib/AST/ByteCode/Program.cpp
@@ -33,7 +33,7 @@ const void *Program::getNativePointer(unsigned Idx) {
return NativePointers[Idx];
}
-unsigned Program::createGlobalString(const StringLiteral *S) {
+unsigned Program::createGlobalString(const StringLiteral *S, const Expr *Base) {
const size_t CharWidth = S->getCharByteWidth();
const size_t BitWidth = CharWidth * Ctx.getCharBit();
@@ -52,12 +52,15 @@ unsigned Program::createGlobalString(const StringLiteral *S) {
llvm_unreachable("unsupported character width");
}
+ if (!Base)
+ Base = S;
+
// Create a descriptor for the string.
- Descriptor *Desc =
- allocateDescriptor(S, CharType, Descriptor::GlobalMD, S->getLength() + 1,
- /*isConst=*/true,
- /*isTemporary=*/false,
- /*isMutable=*/false);
+ Descriptor *Desc = allocateDescriptor(Base, CharType, Descriptor::GlobalMD,
+ S->getLength() + 1,
+ /*isConst=*/true,
+ /*isTemporary=*/false,
+ /*isMutable=*/false);
// Allocate storage for the string.
// The byte length does not include the null terminator.
diff --git a/clang/lib/AST/ByteCode/Program.h b/clang/lib/AST/ByteCode/Program.h
index be84c40714a60b..f676672fb7ced5 100644
--- a/clang/lib/AST/ByteCode/Program.h
+++ b/clang/lib/AST/ByteCode/Program.h
@@ -64,7 +64,8 @@ class Program final {
const void *getNativePointer(unsigned Idx);
/// Emits a string literal among global data.
- unsigned createGlobalString(const StringLiteral *S);
+ unsigned createGlobalString(const StringLiteral *S,
+ const Expr *Base = nullptr);
/// Returns a pointer to a global.
Pointer getPtrGlobal(unsigned Idx) const;
diff --git a/clang/test/AST/ByteCode/cxx1z.cpp b/clang/test/AST/ByteCode/cxx1z.cpp
index 1a06597fa348fe..57f99235a2b201 100644
--- a/clang/test/AST/ByteCode/cxx1z.cpp
+++ b/clang/test/AST/ByteCode/cxx1z.cpp
@@ -13,3 +13,7 @@ namespace Temp {
char arr[3];
A<const char*, &arr[1]> d; // both-error {{refers to subobject '&arr[1]'}}
+
+void Func() {
+ A<const char*, __func__> a; // both-error {{pointer to subobject of predefined '__func__' variable}}
+}
``````````
</details>
https://github.com/llvm/llvm-project/pull/111956
More information about the cfe-commits
mailing list