llvmorg-github-actions[bot] wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: Tadeusz (tadeuszjt)

<details>
<summary>Changes</summary>

**Problem**
C++ 23 introduced consteval expressions which allows `if` statements to have no 
condition:
```
if consteval {
}
```
`DiagnoseUnguardedAvailability::TraverseIfStmt` Assumed `If-&gt;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.

Fixes #<!-- -->219948

---
Full diff: https://github.com/llvm/llvm-project/pull/220004.diff


2 Files Affected:

- (modified) clang/lib/Sema/SemaAvailability.cpp (+6-1) 
- (modified) clang/test/SemaCXX/attr-availability.cpp (+10) 


``````````diff
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

``````````

</details>


https://github.com/llvm/llvm-project/pull/220004
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to