https://github.com/agourakis82 updated https://github.com/llvm/llvm-project/pull/225515
>From 698c8596502cccfb78feb67ab60eaff0936d6bd2 Mon Sep 17 00:00:00 2001 From: Demetrios Chiuratto Agourakis <[email protected]> Date: Tue, 22 Sep 2026 20:30:46 +0000 Subject: [PATCH 1/2] [clang] Stop claiming __builtin_assume_separate_storage is constexpr The builtin is only handled in CodeGen. Marking it Constexpr made constant evaluation accept a call it does not implement. Drop the attribute. Fixes #225335 Assisted-by: Claude --- clang/include/clang/Basic/Builtins.td | 2 +- .../test/SemaCXX/builtin-assume-separate-storage.cpp | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 clang/test/SemaCXX/builtin-assume-separate-storage.cpp diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td index 80d09c089ae95..b7c5afa90a5c1 100644 --- a/clang/include/clang/Basic/Builtins.td +++ b/clang/include/clang/Basic/Builtins.td @@ -4775,7 +4775,7 @@ def Assume : Builtin { def AssumeSeparateStorage : Builtin { let Spellings = ["__builtin_assume_separate_storage"]; - let Attributes = [NoThrow, Constexpr]; + let Attributes = [NoThrow]; let Prototype = "void(void const volatile*, void const volatile*)"; } diff --git a/clang/test/SemaCXX/builtin-assume-separate-storage.cpp b/clang/test/SemaCXX/builtin-assume-separate-storage.cpp new file mode 100644 index 0000000000000..ac46b7bf98369 --- /dev/null +++ b/clang/test/SemaCXX/builtin-assume-separate-storage.cpp @@ -0,0 +1,12 @@ +// RUN: %clang_cc1 -std=c++20 -fsyntax-only -verify %s + +// __builtin_assume_separate_storage is not constant-evaluable (#225335). + +constexpr int separated(int *a, int *b) { // expected-error {{constexpr function never produces a constant expression}} + __builtin_assume_separate_storage(a, b); // expected-note 2 {{subexpression not valid in a constant expression}} + return 0; +} + +constexpr int a = 1, b = 2; +static_assert(separated(const_cast<int *>(&a), const_cast<int *>(&b)) == 0); // expected-error {{static assertion expression is not an integral constant expression}} \ + // expected-note {{in call to 'separated(&a, &b)'}} >From 3e06b148dd4e29fd06b849fe3c30006ab73518d9 Mon Sep 17 00:00:00 2001 From: Demetrios Chiuratto Agourakis <[email protected]> Date: Wed, 23 Sep 2026 08:53:00 +0000 Subject: [PATCH 2/2] [clang] Add release note, bytecode interpreter coverage, and issue repro for __builtin_assume_separate_storage --- clang/docs/ReleaseNotes.md | 1 + .../builtin-assume-separate-storage.cpp | 20 ++++++++++++++----- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/clang/docs/ReleaseNotes.md b/clang/docs/ReleaseNotes.md index 8e5e5e5732a9b..25529bfe4bdf3 100644 --- a/clang/docs/ReleaseNotes.md +++ b/clang/docs/ReleaseNotes.md @@ -551,6 +551,7 @@ features cannot lower the translation-unit ABI level; #### Bug Fixes to Compiler Builtins +- Dropped invalid ``constexpr`` specifier from ``__builtin_assume_separate_storage``, which is only supported in CodeGen. (#GH225335) - Fixed a crash when classifying a call to a builtin with dependent arguments, such as when the call is used as an `auto` non-type template argument. - Fixed an assertion failure when diagnosing a constant evaluation failure diff --git a/clang/test/SemaCXX/builtin-assume-separate-storage.cpp b/clang/test/SemaCXX/builtin-assume-separate-storage.cpp index ac46b7bf98369..64442f368c431 100644 --- a/clang/test/SemaCXX/builtin-assume-separate-storage.cpp +++ b/clang/test/SemaCXX/builtin-assume-separate-storage.cpp @@ -1,12 +1,22 @@ -// RUN: %clang_cc1 -std=c++20 -fsyntax-only -verify %s +// RUN: %clang_cc1 -std=c++20 -fsyntax-only -verify=ref,both %s +// RUN: %clang_cc1 -std=c++20 -fsyntax-only -verify=expected,both -fexperimental-new-constant-interpreter %s // __builtin_assume_separate_storage is not constant-evaluable (#225335). -constexpr int separated(int *a, int *b) { // expected-error {{constexpr function never produces a constant expression}} - __builtin_assume_separate_storage(a, b); // expected-note 2 {{subexpression not valid in a constant expression}} +constexpr int separated(int *a, int *b) { // ref-error {{constexpr function never produces a constant expression}} + __builtin_assume_separate_storage(a, b); // ref-note 2 {{subexpression not valid in a constant expression}} \ + // expected-note {{subexpression not valid in a constant expression}} return 0; } constexpr int a = 1, b = 2; -static_assert(separated(const_cast<int *>(&a), const_cast<int *>(&b)) == 0); // expected-error {{static assertion expression is not an integral constant expression}} \ - // expected-note {{in call to 'separated(&a, &b)'}} +static_assert(separated(const_cast<int *>(&a), const_cast<int *>(&b)) == 0); // both-error {{static assertion expression is not an integral constant expression}} \ + // both-note {{in call to 'separated(&a, &b)'}} + +// Original reproducer from #225335 +static_assert([] { // both-error {{static assertion expression is not an integral constant expression}} \ + // both-note {{in call to '[] {}.operator()()'}} + int i, j; + __builtin_assume_separate_storage(&i, &j); // both-note {{subexpression not valid in a constant expression}} + return true; +}()); _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
