[clang] [LifetimeSafety] Remove "experimental-" prefix from flags and diagnostics (PR #176821)
Utkarsh Saxena via cfe-commits
cfe-commits at lists.llvm.org
Tue Jan 20 05:26:20 PST 2026
https://github.com/usx95 updated https://github.com/llvm/llvm-project/pull/176821
>From b07ae2947f11a2b085af78dd7b596edc4c0af174 Mon Sep 17 00:00:00 2001
From: Utkarsh Saxena <usx at google.com>
Date: Mon, 19 Jan 2026 21:05:46 +0000
Subject: [PATCH] Remove experimental from lifetime-safety
---
clang/include/clang/Basic/DiagnosticGroups.td | 12 ++++++------
clang/include/clang/Basic/LangOptions.def | 6 +++---
clang/include/clang/Options/Options.td | 6 +++---
clang/lib/Sema/AnalysisBasedWarnings.cpp | 12 +++++++++++-
clang/test/Analysis/LifetimeSafety/benchmark.py | 3 +--
clang/test/Sema/warn-lifetime-analysis-nocfg.cpp | 4 ++--
clang/test/Sema/warn-lifetime-safety-dataflow.cpp | 2 +-
.../warn-lifetime-safety-missing-origin-stats.cpp | 2 +-
clang/test/Sema/warn-lifetime-safety-suggestions.cpp | 2 +-
clang/test/Sema/warn-lifetime-safety.cpp | 4 ++--
10 files changed, 31 insertions(+), 22 deletions(-)
diff --git a/clang/include/clang/Basic/DiagnosticGroups.td b/clang/include/clang/Basic/DiagnosticGroups.td
index de1d1e13ea712..34624dd3eed3a 100644
--- a/clang/include/clang/Basic/DiagnosticGroups.td
+++ b/clang/include/clang/Basic/DiagnosticGroups.td
@@ -533,20 +533,20 @@ def Dangling : DiagGroup<"dangling", [DanglingAssignment,
DanglingGsl,
ReturnStackAddress]>;
-def LifetimeSafetyPermissive : DiagGroup<"experimental-lifetime-safety-permissive">;
-def LifetimeSafetyStrict : DiagGroup<"experimental-lifetime-safety-strict">;
-def LifetimeSafety : DiagGroup<"experimental-lifetime-safety",
+def LifetimeSafetyPermissive : DiagGroup<"lifetime-safety-permissive">;
+def LifetimeSafetyStrict : DiagGroup<"lifetime-safety-strict">;
+def LifetimeSafety : DiagGroup<"lifetime-safety",
[LifetimeSafetyPermissive, LifetimeSafetyStrict]> {
code Documentation = [{
Experimental warnings to detect use-after-free and related temporal safety bugs based on lifetime safety analysis.
}];
}
def LifetimeSafetyCrossTUSuggestions
- : DiagGroup<"experimental-lifetime-safety-cross-tu-suggestions">;
+ : DiagGroup<"lifetime-safety-cross-tu-suggestions">;
def LifetimeSafetyIntraTUSuggestions
- : DiagGroup<"experimental-lifetime-safety-intra-tu-suggestions">;
+ : DiagGroup<"lifetime-safety-intra-tu-suggestions">;
def LifetimeSafetySuggestions
- : DiagGroup<"experimental-lifetime-safety-suggestions",
+ : DiagGroup<"lifetime-safety-suggestions",
[LifetimeSafetyCrossTUSuggestions,
LifetimeSafetyIntraTUSuggestions]> {
code Documentation = [{
diff --git a/clang/include/clang/Basic/LangOptions.def b/clang/include/clang/Basic/LangOptions.def
index 36fec24638363..a86394aa44f6b 100644
--- a/clang/include/clang/Basic/LangOptions.def
+++ b/clang/include/clang/Basic/LangOptions.def
@@ -501,12 +501,12 @@ LANGOPT(CheckConstexprFunctionBodies, 1, 1, Benign,
LANGOPT(BoundsSafety, 1, 0, NotCompatible, "Bounds safety extension for C")
-LANGOPT(EnableLifetimeSafety, 1, 0, NotCompatible, "Experimental lifetime safety analysis for C++")
+LANGOPT(EnableLifetimeSafety, 1, 0, NotCompatible, "Lifetime safety analysis for C++")
-LANGOPT(EnableLifetimeSafetyInference, 1, 0, NotCompatible, "Experimental lifetime safety inference analysis for C++")
+LANGOPT(EnableLifetimeSafetyInference, 1, 0, NotCompatible, "Lifetime safety inference analysis for C++")
// TODO: Remove flag and default to end-of-TU analysis for lifetime safety after performance validation.
-LANGOPT(EnableLifetimeSafetyTUAnalysis, 1, 0, NotCompatible, "Experimental lifetime safety at translation-unit end, analyzing functions in call graph post-order for C++")
+LANGOPT(EnableLifetimeSafetyTUAnalysis, 1, 0, NotCompatible, "Lifetime safety at translation-unit end, analyzing functions in call graph post-order for C++")
LANGOPT(PreserveVec3Type, 1, 0, NotCompatible, "Preserve 3-component vector type")
diff --git a/clang/include/clang/Options/Options.td b/clang/include/clang/Options/Options.td
index 188739e72434a..88ae8a7286ee9 100644
--- a/clang/include/clang/Options/Options.td
+++ b/clang/include/clang/Options/Options.td
@@ -1961,15 +1961,15 @@ defm bounds_safety : BoolFOption<
" experimental bounds safety extension for C">>;
defm lifetime_safety : BoolFOption<
- "experimental-lifetime-safety",
- LangOpts<"EnableLifetimeSafety">, DefaultFalse,
+ "lifetime-safety",
+ LangOpts<"EnableLifetimeSafety">, DefaultTrue,
PosFlag<SetTrue, [], [CC1Option], "Enable">,
NegFlag<SetFalse, [], [CC1Option], "Disable">,
BothFlags<[], [CC1Option],
" experimental lifetime safety for C++">>;
defm lifetime_safety_inference
- : BoolFOption<"experimental-lifetime-safety-inference",
+ : BoolFOption<"lifetime-safety-inference",
LangOpts<"EnableLifetimeSafetyInference">, DefaultFalse,
PosFlag<SetTrue, [], [CC1Option], "Enable">,
NegFlag<SetFalse, [], [CC1Option], "Disable">,
diff --git a/clang/lib/Sema/AnalysisBasedWarnings.cpp b/clang/lib/Sema/AnalysisBasedWarnings.cpp
index 793ece2c937de..4a1ec4ddb004c 100644
--- a/clang/lib/Sema/AnalysisBasedWarnings.cpp
+++ b/clang/lib/Sema/AnalysisBasedWarnings.cpp
@@ -3063,9 +3063,19 @@ void clang::sema::AnalysisBasedWarnings::IssueWarnings(
AC.getCFGBuildOptions().AddCXXNewAllocator = false;
AC.getCFGBuildOptions().AddCXXDefaultInitExprInCtors = true;
+ bool IsLifetimeSafetyDiagnosticEnabled =
+ !Diags.isIgnored(diag::warn_lifetime_safety_loan_expires_permissive,
+ D->getBeginLoc()) ||
+ !Diags.isIgnored(diag::warn_lifetime_safety_loan_expires_strict,
+ D->getBeginLoc()) ||
+ !Diags.isIgnored(diag::warn_lifetime_safety_return_stack_addr_permissive,
+ D->getBeginLoc()) ||
+ !Diags.isIgnored(diag::warn_lifetime_safety_return_stack_addr_strict,
+ D->getBeginLoc());
bool EnableLifetimeSafetyAnalysis =
S.getLangOpts().EnableLifetimeSafety &&
- !S.getLangOpts().EnableLifetimeSafetyTUAnalysis;
+ !S.getLangOpts().EnableLifetimeSafetyTUAnalysis &&
+ IsLifetimeSafetyDiagnosticEnabled;
// Force that certain expressions appear as CFGElements in the CFG. This
// is used to speed up various analyses.
diff --git a/clang/test/Analysis/LifetimeSafety/benchmark.py b/clang/test/Analysis/LifetimeSafety/benchmark.py
index cd5b30818a4a8..a7fe5d28cb884 100644
--- a/clang/test/Analysis/LifetimeSafety/benchmark.py
+++ b/clang/test/Analysis/LifetimeSafety/benchmark.py
@@ -350,8 +350,7 @@ def run_single_test(
"-o",
"/dev/null",
"-ftime-trace=" + trace_file,
- "-Xclang",
- "-fexperimental-lifetime-safety",
+ "-Wlifetime-safety",
"-std=c++17",
source_file,
]
diff --git a/clang/test/Sema/warn-lifetime-analysis-nocfg.cpp b/clang/test/Sema/warn-lifetime-analysis-nocfg.cpp
index 86634e70eb4eb..a38a4b440891c 100644
--- a/clang/test/Sema/warn-lifetime-analysis-nocfg.cpp
+++ b/clang/test/Sema/warn-lifetime-analysis-nocfg.cpp
@@ -1,6 +1,6 @@
// RUN: %clang_cc1 -fsyntax-only -Wdangling -Wdangling-field -Wreturn-stack-address -verify %s
-// RUN: %clang_cc1 -fsyntax-only -fexperimental-lifetime-safety -Wexperimental-lifetime-safety -Wno-dangling -verify=cfg %s
-// RUN: %clang_cc1 -fsyntax-only -fexperimental-lifetime-safety -fexperimental-lifetime-safety-inference -fexperimental-lifetime-safety-tu-analysis -Wexperimental-lifetime-safety -Wno-dangling -verify=cfg %s
+// RUN: %clang_cc1 -fsyntax-only -Wlifetime-safety -Wno-dangling -verify=cfg %s
+// RUN: %clang_cc1 -fsyntax-only -flifetime-safety-inference -fexperimental-lifetime-safety-tu-analysis -Wlifetime-safety -Wno-dangling -verify=cfg %s
#include "Inputs/lifetime-analysis.h"
diff --git a/clang/test/Sema/warn-lifetime-safety-dataflow.cpp b/clang/test/Sema/warn-lifetime-safety-dataflow.cpp
index 6fc7c776f935c..a45100feb3f28 100644
--- a/clang/test/Sema/warn-lifetime-safety-dataflow.cpp
+++ b/clang/test/Sema/warn-lifetime-safety-dataflow.cpp
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -fexperimental-lifetime-safety -mllvm -debug-only=LifetimeFacts -Wexperimental-lifetime-safety %s 2>&1 | FileCheck %s
+// RUN: %clang_cc1 -mllvm -debug-only=LifetimeFacts -Wlifetime-safety %s 2>&1 | FileCheck %s
// REQUIRES: asserts
struct MyObj {
diff --git a/clang/test/Sema/warn-lifetime-safety-missing-origin-stats.cpp b/clang/test/Sema/warn-lifetime-safety-missing-origin-stats.cpp
index 446bbe0e06b13..733b239ca3a57 100644
--- a/clang/test/Sema/warn-lifetime-safety-missing-origin-stats.cpp
+++ b/clang/test/Sema/warn-lifetime-safety-missing-origin-stats.cpp
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -print-stats -fexperimental-lifetime-safety -Wexperimental-lifetime-safety %s 2>&1 | FileCheck %s
+// RUN: %clang_cc1 -print-stats -Wlifetime-safety %s 2>&1 | FileCheck %s
// CHECK: *** LifetimeSafety Missing Origin per QualType: (QualType : count) :
diff --git a/clang/test/Sema/warn-lifetime-safety-suggestions.cpp b/clang/test/Sema/warn-lifetime-safety-suggestions.cpp
index bb8fd3933b55d..1f8163cb16701 100644
--- a/clang/test/Sema/warn-lifetime-safety-suggestions.cpp
+++ b/clang/test/Sema/warn-lifetime-safety-suggestions.cpp
@@ -1,6 +1,6 @@
// RUN: rm -rf %t
// RUN: split-file %s %t
-// RUN: %clang_cc1 -fsyntax-only -fexperimental-lifetime-safety -fexperimental-lifetime-safety-inference -fexperimental-lifetime-safety-tu-analysis -Wexperimental-lifetime-safety-suggestions -Wexperimental-lifetime-safety -Wno-dangling -I%t -verify %t/test_source.cpp
+// RUN: %clang_cc1 -fsyntax-only -flifetime-safety -flifetime-safety-inference -fexperimental-lifetime-safety-tu-analysis -Wlifetime-safety-suggestions -Wlifetime-safety -Wno-dangling -I%t -verify %t/test_source.cpp
View definition_before_header(View a);
diff --git a/clang/test/Sema/warn-lifetime-safety.cpp b/clang/test/Sema/warn-lifetime-safety.cpp
index 11c86d23d89f6..4272f660a4adf 100644
--- a/clang/test/Sema/warn-lifetime-safety.cpp
+++ b/clang/test/Sema/warn-lifetime-safety.cpp
@@ -1,5 +1,5 @@
-// RUN: %clang_cc1 -fsyntax-only -fexperimental-lifetime-safety -Wexperimental-lifetime-safety -Wno-dangling -verify=expected,function %s
-// RUN: %clang_cc1 -fsyntax-only -fexperimental-lifetime-safety -fexperimental-lifetime-safety-inference -fexperimental-lifetime-safety-tu-analysis -Wexperimental-lifetime-safety -Wno-dangling -verify %s
+// RUN: %clang_cc1 -fsyntax-only -Wlifetime-safety -Wno-dangling -verify=expected,function %s
+// RUN: %clang_cc1 -fsyntax-only -flifetime-safety-inference -fexperimental-lifetime-safety-tu-analysis -Wlifetime-safety -Wno-dangling -verify %s
#include "Inputs/lifetime-analysis.h"
More information about the cfe-commits
mailing list