[llvm-branch-commits] [clang] Remove experimental from lifetime-safety (PR #176821)
Utkarsh Saxena via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Mon Jan 19 13:06:12 PST 2026
https://github.com/usx95 created https://github.com/llvm/llvm-project/pull/176821
None
>From a68c5bf9acf132c3fa0d78071d59d34f4868ca6f 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 | 4 ++--
clang/lib/Sema/AnalysisBasedWarnings.cpp | 12 +++++++++++-
clang/test/Analysis/LifetimeSafety/benchmark.py | 2 +-
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, 30 insertions(+), 20 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..2cccaef24a63a 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, 1, 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..b84f01cb8f252 100644
--- a/clang/include/clang/Options/Options.td
+++ b/clang/include/clang/Options/Options.td
@@ -1961,7 +1961,7 @@ defm bounds_safety : BoolFOption<
" experimental bounds safety extension for C">>;
defm lifetime_safety : BoolFOption<
- "experimental-lifetime-safety",
+ "lifetime-safety",
LangOpts<"EnableLifetimeSafety">, DefaultFalse,
PosFlag<SetTrue, [], [CC1Option], "Enable">,
NegFlag<SetFalse, [], [CC1Option], "Disable">,
@@ -1969,7 +1969,7 @@ defm lifetime_safety : BoolFOption<
" 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 c7170f48e0bc2..7278de6e2c21c 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;
if (EnableLifetimeSafetyAnalysis)
AC.getCFGBuildOptions().AddLifetime = true;
diff --git a/clang/test/Analysis/LifetimeSafety/benchmark.py b/clang/test/Analysis/LifetimeSafety/benchmark.py
index cd5b30818a4a8..3623af8674ec4 100644
--- a/clang/test/Analysis/LifetimeSafety/benchmark.py
+++ b/clang/test/Analysis/LifetimeSafety/benchmark.py
@@ -351,7 +351,7 @@ def run_single_test(
"/dev/null",
"-ftime-trace=" + trace_file,
"-Xclang",
- "-fexperimental-lifetime-safety",
+ "-flifetime-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 df1bd6ee88a6c..0a4027ab96d5b 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 -flifetime-safety -Wlifetime-safety -Wno-dangling -verify=cfg %s
+// RUN: %clang_cc1 -fsyntax-only -flifetime-safety -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..7fbfa50377e70 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 -flifetime-safety -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..9ec3e8d05a599 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 -flifetime-safety -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 6e3a6f1fd9117..9b6f42ff10285 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 fc6dfc9fd9c51..1deadc3399142 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 -flifetime-safety -Wlifetime-safety -Wno-dangling -verify=expected,function %s
+// RUN: %clang_cc1 -fsyntax-only -flifetime-safety -flifetime-safety-inference -fexperimental-lifetime-safety-tu-analysis -Wlifetime-safety -Wno-dangling -verify %s
#include "Inputs/lifetime-analysis.h"
More information about the llvm-branch-commits
mailing list