https://github.com/yronglin updated 
https://github.com/llvm/llvm-project/pull/206703

>From 698bc744538698133dc71002b7c4813a196130ca Mon Sep 17 00:00:00 2001
From: yronglin <[email protected]>
Date: Tue, 30 Jun 2026 03:02:51 -0700
Subject: [PATCH 1/2] [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 bb23084d73e3f7e574a884d7cd5c081a3f70f9e2 Mon Sep 17 00:00:00 2001
From: yronglin <[email protected]>
Date: Thu, 2 Jul 2026 04:45:52 -0700
Subject: [PATCH 2/2] Refine test

Signed-off-by: yronglin <[email protected]>
---
 clang/test/SemaCXX/type-traits-incomplete.cpp | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/clang/test/SemaCXX/type-traits-incomplete.cpp 
b/clang/test/SemaCXX/type-traits-incomplete.cpp
index 2f56b5fa81820..2e09d60eecd81 100644
--- a/clang/test/SemaCXX/type-traits-incomplete.cpp
+++ b/clang/test/SemaCXX/type-traits-incomplete.cpp
@@ -1,6 +1,9 @@
 // RUN: %clang_cc1 -fsyntax-only -verify %s 
 
-struct S; // expected-note 6 {{forward declaration of 'S'}}
+struct S; // expected-note 8 {{forward declaration of 'S'}}
+
+struct NoConv {};
+struct Bad { template<class T> Bad(T v) noexcept(noexcept(member_ = v)) {} int 
member_; };
 
 void f() {
   __is_pod(S); // expected-error{{incomplete type 'S' used in type trait 
expression}}
@@ -11,10 +14,7 @@ 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}}
 
+  static_assert(!__reference_constructs_from_temporary(S, NoConv&&)); // 
expected-error{{incomplete type 'S' used in type trait expression}}
+  static_assert(!__reference_constructs_from_temporary(Bad, S)); // 
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

Reply via email to