[PATCH] D146426: [Sema] Fix crash on __fp16 parameters in template instantiations
Ilya Biryukov via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Mar 21 06:09:38 PDT 2023
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rG282cae0b9a60: [Sema] Fix crash on __fp16 parameters in template instantiations (authored by ilya-biryukov).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D146426/new/
https://reviews.llvm.org/D146426
Files:
clang/lib/Sema/SemaChecking.cpp
clang/lib/Sema/SemaDeclCXX.cpp
clang/lib/Sema/SemaLambda.cpp
clang/lib/Sema/SemaTemplateInstantiate.cpp
clang/test/SemaCXX/GH61441.cpp
Index: clang/test/SemaCXX/GH61441.cpp
===================================================================
--- /dev/null
+++ clang/test/SemaCXX/GH61441.cpp
@@ -0,0 +1,12 @@
+// RUN: %clang_cc1 -fsyntax-only -verify -cl-std=clc++ -fblocks %s
+// Checks Clang does not crash. We run in OpenCL mode to trigger block pointer
+// crash. The __fp16 crash happens in standard mode too.
+
+template <bool>
+int foo() {
+ auto x = [&](__fp16) { return 0; }; // expected-error {{not allowed}}
+ auto y = [&](void(^)(int)) { return 0; }; // expected-error {{not allowed}}
+ return 0;
+}
+
+int bar() { return foo<true>(); }
Index: clang/lib/Sema/SemaTemplateInstantiate.cpp
===================================================================
--- clang/lib/Sema/SemaTemplateInstantiate.cpp
+++ clang/lib/Sema/SemaTemplateInstantiate.cpp
@@ -1343,7 +1343,7 @@
CXXMethodDecl *MD = Result.getAs<LambdaExpr>()->getCallOperator();
for (ParmVarDecl *PVD : MD->parameters()) {
- if (!PVD->hasDefaultArg())
+ if (!PVD || !PVD->hasDefaultArg())
continue;
Expr *UninstExpr = PVD->getUninstantiatedDefaultArg();
// FIXME: Obtain the source location for the '=' token.
Index: clang/lib/Sema/SemaLambda.cpp
===================================================================
--- clang/lib/Sema/SemaLambda.cpp
+++ clang/lib/Sema/SemaLambda.cpp
@@ -966,8 +966,11 @@
if (!Params.empty()) {
CheckParmsForFunctionDef(Params, /*CheckParameterNames=*/false);
Method->setParams(Params);
- for (auto P : Method->parameters())
+ for (auto P : Method->parameters()) {
+ if (!P)
+ continue;
P->setOwningFunction(Method);
+ }
}
buildLambdaScopeReturnType(*this, LSI, Method, HasExplicitResultType);
Index: clang/lib/Sema/SemaDeclCXX.cpp
===================================================================
--- clang/lib/Sema/SemaDeclCXX.cpp
+++ clang/lib/Sema/SemaDeclCXX.cpp
@@ -1712,6 +1712,8 @@
/// Check whether a function's parameter types are all literal types. If so,
/// return true. If not, produce a suitable diagnostic and return false.
+/// If any ParamDecl is null, return false without producing a diagnostic.
+/// The code creating null parameters is responsible for producing a diagnostic.
static bool CheckConstexprParameterTypes(Sema &SemaRef,
const FunctionDecl *FD,
Sema::CheckConstexprKind Kind) {
@@ -1721,6 +1723,8 @@
e = FT->param_type_end();
i != e; ++i, ++ArgIndex) {
const ParmVarDecl *PD = FD->getParamDecl(ArgIndex);
+ if (!PD)
+ return false;
SourceLocation ParamLoc = PD->getLocation();
if (CheckLiteralType(SemaRef, Kind, ParamLoc, *i,
diag::err_constexpr_non_literal_param, ArgIndex + 1,
Index: clang/lib/Sema/SemaChecking.cpp
===================================================================
--- clang/lib/Sema/SemaChecking.cpp
+++ clang/lib/Sema/SemaChecking.cpp
@@ -15879,6 +15879,10 @@
bool CheckParameterNames) {
bool HasInvalidParm = false;
for (ParmVarDecl *Param : Parameters) {
+ if (!Param) {
+ HasInvalidParm = true;
+ continue;
+ }
// C99 6.7.5.3p4: the parameters in a parameter type list in a
// function declarator that is part of a function definition of
// that function shall not have incomplete type.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D146426.506938.patch
Type: text/x-patch
Size: 3499 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20230321/60eef3ae/attachment.bin>
More information about the cfe-commits
mailing list