[clang] 6a197b3 - [clang][Interp] Fix returning references to functions
Timm Bäder via cfe-commits
cfe-commits at lists.llvm.org
Mon May 27 06:43:38 PDT 2024
Author: Timm Bäder
Date: 2024-05-27T15:43:12+02:00
New Revision: 6a197b35db0805e77d5103382b5b516ca0c2db1d
URL: https://github.com/llvm/llvm-project/commit/6a197b35db0805e77d5103382b5b516ca0c2db1d
DIFF: https://github.com/llvm/llvm-project/commit/6a197b35db0805e77d5103382b5b516ca0c2db1d.diff
LOG: [clang][Interp] Fix returning references to functions
Previously, we pushed a pointer to the stack and later tried to use
it as if it was a function pointer, which doesn't work.
Added:
Modified:
clang/lib/AST/Interp/ByteCodeExprGen.cpp
clang/test/AST/Interp/functions.cpp
Removed:
################################################################################
diff --git a/clang/lib/AST/Interp/ByteCodeExprGen.cpp b/clang/lib/AST/Interp/ByteCodeExprGen.cpp
index 737bef85e2fc8..37c45e4311afb 100644
--- a/clang/lib/AST/Interp/ByteCodeExprGen.cpp
+++ b/clang/lib/AST/Interp/ByteCodeExprGen.cpp
@@ -3775,13 +3775,13 @@ bool ByteCodeExprGen<Emitter>::VisitDeclRefExpr(const DeclRefExpr *E) {
return this->emitGetPtrLocal(Offset, E);
} else if (auto GlobalIndex = P.getGlobal(D)) {
if (IsReference)
- return this->emitGetGlobalPtr(*GlobalIndex, E);
+ return this->emitGetGlobal(classifyPrim(E), *GlobalIndex, E);
return this->emitGetPtrGlobal(*GlobalIndex, E);
} else if (const auto *PVD = dyn_cast<ParmVarDecl>(D)) {
if (auto It = this->Params.find(PVD); It != this->Params.end()) {
if (IsReference || !It->second.IsPtr)
- return this->emitGetParamPtr(It->second.Offset, E);
+ return this->emitGetParam(classifyPrim(E), It->second.Offset, E);
return this->emitGetPtrParam(It->second.Offset, E);
}
diff --git a/clang/test/AST/Interp/functions.cpp b/clang/test/AST/Interp/functions.cpp
index e95ade8ef51b7..10c62a43ef33b 100644
--- a/clang/test/AST/Interp/functions.cpp
+++ b/clang/test/AST/Interp/functions.cpp
@@ -623,3 +623,9 @@ namespace FuncPtrParam {
*a; // both-warning {{expression result unused}}
}
}
+
+namespace {
+ void f() noexcept;
+ void (&r)() = f;
+ void (&cond3)() = r;
+}
More information about the cfe-commits
mailing list