https://github.com/yronglin updated https://github.com/llvm/llvm-project/pull/206703
>From c9e3e6194e58b65a611bad3e356119495ffb5e12 Mon Sep 17 00:00:00 2001 From: yronglin <[email protected]> Date: Tue, 30 Jun 2026 03:02:51 -0700 Subject: [PATCH 1/3] [clang] Check precondition of __reference_constructs_from_temporary Signed-off-by: yronglin <[email protected]> --- clang/lib/Sema/SemaTypeTraits.cpp | 5 ++--- clang/test/SemaCXX/type-traits-incomplete.cpp | 6 ++++++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/clang/lib/Sema/SemaTypeTraits.cpp b/clang/lib/Sema/SemaTypeTraits.cpp index 4de73601e273d..e3ae6095c846c 100644 --- a/clang/lib/Sema/SemaTypeTraits.cpp +++ b/clang/lib/Sema/SemaTypeTraits.cpp @@ -1292,8 +1292,6 @@ static bool EvaluateBooleanTypeTrait(Sema &S, TypeTrait Kind, Kind == clang::BTT_ReferenceBindsToTemporary || Kind == clang::BTT_ReferenceConstructsFromTemporary || Kind == clang::BTT_ReferenceConvertsFromTemporary; - if (UseRawObjectType && !Args[0]->getType()->isReferenceType()) - return false; // Precondition: T and all types in the parameter pack Args shall be // complete types, (possibly cv-qualified) void, or arrays of @@ -1310,7 +1308,8 @@ static bool EvaluateBooleanTypeTrait(Sema &S, TypeTrait Kind, // Make sure the first argument is not incomplete nor a function type. QualType T = Args[0]->getType(); - if (T->isIncompleteType() || T->isFunctionType()) + if (T->isIncompleteType() || T->isFunctionType() || + (UseRawObjectType && !T->isReferenceType())) return false; // Make sure the first argument is not an abstract type. diff --git a/clang/test/SemaCXX/type-traits-incomplete.cpp b/clang/test/SemaCXX/type-traits-incomplete.cpp index 3e341d6482440..2f56b5fa81820 100644 --- a/clang/test/SemaCXX/type-traits-incomplete.cpp +++ b/clang/test/SemaCXX/type-traits-incomplete.cpp @@ -12,3 +12,9 @@ void f() { __is_trivially_relocatable(S); // expected-error{{incomplete type 'S' used in type trait expression}} __is_trivially_relocatable(S[]); // expected-error{{incomplete type 'S' used in type trait expression}} } + +struct NoConv; +struct Bad; + +constexpr bool a = __reference_constructs_from_temporary(S, NoConv&&); // expected-error{{incomplete type 'Bad' used in type trait expression}} + >From b4735ced8f51e7027553400b53bad54eff4b6dad Mon Sep 17 00:00:00 2001 From: Yihan Wang <[email protected]> Date: Tue, 30 Jun 2026 19:55:44 +0800 Subject: [PATCH 2/3] Fix test --- clang/test/SemaCXX/type-traits-incomplete.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/test/SemaCXX/type-traits-incomplete.cpp b/clang/test/SemaCXX/type-traits-incomplete.cpp index 2f56b5fa81820..b5b4df9a8f743 100644 --- a/clang/test/SemaCXX/type-traits-incomplete.cpp +++ b/clang/test/SemaCXX/type-traits-incomplete.cpp @@ -16,5 +16,5 @@ void f() { struct NoConv; struct Bad; -constexpr bool a = __reference_constructs_from_temporary(S, NoConv&&); // expected-error{{incomplete type 'Bad' used in type trait expression}} +constexpr bool a = __reference_constructs_from_temporary(Bad, NoConv&&); // expected-error{{incomplete type 'Bad' used in type trait expression}} >From 47541af93c33f12ee5cc9ebba9cd5abd7ed0c326 Mon Sep 17 00:00:00 2001 From: Yihan Wang <[email protected]> Date: Tue, 30 Jun 2026 20:07:30 +0800 Subject: [PATCH 3/3] Fix Test --- clang/test/SemaCXX/type-traits-incomplete.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/clang/test/SemaCXX/type-traits-incomplete.cpp b/clang/test/SemaCXX/type-traits-incomplete.cpp index b5b4df9a8f743..44941f7ee41a3 100644 --- a/clang/test/SemaCXX/type-traits-incomplete.cpp +++ b/clang/test/SemaCXX/type-traits-incomplete.cpp @@ -1,6 +1,6 @@ // RUN: %clang_cc1 -fsyntax-only -verify %s -struct S; // expected-note 6 {{forward declaration of 'S'}} +struct S; // expected-note 7 {{forward declaration of 'S'}} void f() { __is_pod(S); // expected-error{{incomplete type 'S' used in type trait expression}} @@ -14,7 +14,6 @@ void f() { } struct NoConv; -struct Bad; -constexpr bool a = __reference_constructs_from_temporary(Bad, NoConv&&); // expected-error{{incomplete type 'Bad' used in type trait expression}} +constexpr bool a = __reference_constructs_from_temporary(S, NoConv&&); // expected-error{{incomplete type 'S' used in type trait expression}} _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
