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