https://github.com/tadeuszjt created
https://github.com/llvm/llvm-project/pull/220004
**Problem**
C++ 23 introduced consteval expressions which allows `if` statements to have no
condition:
```
if consteval {
}
```
`DiagnoseUnguardedAvailability::TraverseIfStmt` Assumed `If->getCond()` would
never return a `nullptr`, causing a `nullptr` dereference.
**Fix**
Added a `nullptr` check to `TraverseIfStmt`, continuing in a way consistent
with another check in the function and an associated test which has been
checked to fail without the fix.
>From 042c367d10b1b4dc9efc10e0330932dc799c1ff7 Mon Sep 17 00:00:00 2001
From: Tadeusz Tomoszek <[email protected]>
Date: Mon, 31 Aug 2026 17:02:12 +0200
Subject: [PATCH] [Clang] Fix Crash in Sema::DiagnoseUnguardedAvailability On
'if' With No Condition
---
clang/lib/Sema/SemaAvailability.cpp | 7 ++++++-
clang/test/SemaCXX/attr-availability.cpp | 10 ++++++++++
2 files changed, 16 insertions(+), 1 deletion(-)
diff --git a/clang/lib/Sema/SemaAvailability.cpp
b/clang/lib/Sema/SemaAvailability.cpp
index 28a4b760dbd4d..bfa2a7409d80a 100644
--- a/clang/lib/Sema/SemaAvailability.cpp
+++ b/clang/lib/Sema/SemaAvailability.cpp
@@ -1068,7 +1068,12 @@ ExtractedAvailabilityExpr extractAvailabilityExpr(const
Expr *IfCond) {
}
bool DiagnoseUnguardedAvailability::TraverseIfStmt(IfStmt *If) {
- ExtractedAvailabilityExpr IfCond = extractAvailabilityExpr(If->getCond());
+ Expr *Cond = If->getCond();
+ if (!Cond) {
+ return DynamicRecursiveASTVisitor::TraverseIfStmt(If);
+ }
+
+ ExtractedAvailabilityExpr IfCond = extractAvailabilityExpr(Cond);
if (!IfCond.E) {
// This isn't an availability checking 'if', we can just continue.
return DynamicRecursiveASTVisitor::TraverseIfStmt(If);
diff --git a/clang/test/SemaCXX/attr-availability.cpp
b/clang/test/SemaCXX/attr-availability.cpp
index 8964bdbd34d44..cfb2fda3e1c75 100644
--- a/clang/test/SemaCXX/attr-availability.cpp
+++ b/clang/test/SemaCXX/attr-availability.cpp
@@ -1,4 +1,5 @@
// RUN: %clang_cc1 -triple x86_64-apple-macosx10.9.0 -std=c++11 -fsyntax-only
-verify %s
+// RUN: %clang_cc1 -triple x86_64-apple-macosx10.9.0 -std=c++23 -fsyntax-only
-verify %s
__attribute__((availability(macos, introduced = 10.0))) int init10();
__attribute__((availability(macos, introduced = 11.0))) int init11(); //
expected-note 2 {{'init11' has been marked as being introduced in macOS 11.0}}
@@ -19,3 +20,12 @@ struct S : B0, B1 {
{}
int i0, i1;
};
+
+#if __cplusplus >= 202302L
+void ifConsteval() {
+ if (__builtin_available(macos 10.12, *))
+ ;
+ if consteval {
+ }
+}
+#endif
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits