https://github.com/zahiraam updated 
https://github.com/llvm/llvm-project/pull/168943

>From 4a4e129ccad9c6ed605b1c510a90bc845abbc676 Mon Sep 17 00:00:00 2001
From: Zahira Ammarguellat <[email protected]>
Date: Thu, 20 Nov 2025 12:38:25 -0800
Subject: [PATCH 1/2] Desugar complex element types for promoted complex
 division

---
 clang/lib/CodeGen/CGExprComplex.cpp       |  3 +-
 clang/lib/Sema/SemaExpr.cpp               |  4 +-
 clang/test/CodeGen/promoted-complex-div.c | 52 +++++++++++++++++++++++
 3 files changed, 56 insertions(+), 3 deletions(-)

diff --git a/clang/lib/CodeGen/CGExprComplex.cpp 
b/clang/lib/CodeGen/CGExprComplex.cpp
index d281c4c20616a..f33e5d75296eb 100644
--- a/clang/lib/CodeGen/CGExprComplex.cpp
+++ b/clang/lib/CodeGen/CGExprComplex.cpp
@@ -320,7 +320,8 @@ class ComplexExprEmitter
   QualType getPromotionType(FPOptionsOverride Features, QualType Ty,
                             bool IsComplexDivisor) {
     if (auto *CT = Ty->getAs<ComplexType>()) {
-      QualType ElementType = CT->getElementType();
+      QualType ElementType =
+          CT->getElementType().getDesugaredType(CGF.getContext());
       bool IsFloatingType = ElementType->isFloatingType();
       bool IsComplexRangePromoted = CGF.getLangOpts().getComplexRange() ==
                                     LangOptions::ComplexRangeKind::CX_Promoted;
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index 10f0ec3010c6c..ea7937d551ddb 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -10726,13 +10726,13 @@ static void DetectPrecisionLossInComplexDivision(Sema 
&S, QualType DivisorTy,
   if (!CT)
     return;
 
-  QualType ElementType = CT->getElementType();
+  ASTContext &Ctx = S.getASTContext();
+  QualType ElementType = CT->getElementType().getDesugaredType(Ctx);
   bool IsComplexRangePromoted = S.getLangOpts().getComplexRange() ==
                                 LangOptions::ComplexRangeKind::CX_Promoted;
   if (!ElementType->isFloatingType() || !IsComplexRangePromoted)
     return;
 
-  ASTContext &Ctx = S.getASTContext();
   QualType HigherElementType = Ctx.GetHigherPrecisionFPType(ElementType);
   const llvm::fltSemantics &ElementTypeSemantics =
       Ctx.getFloatTypeSemantics(ElementType);
diff --git a/clang/test/CodeGen/promoted-complex-div.c 
b/clang/test/CodeGen/promoted-complex-div.c
index 7ed7b07db83ae..006b5e334e6ea 100644
--- a/clang/test/CodeGen/promoted-complex-div.c
+++ b/clang/test/CodeGen/promoted-complex-div.c
@@ -81,3 +81,55 @@ _Complex double divf(_Complex double a, _Complex double b) {
 
   return a / b; // nopromotion-warning{{excess precision is requested but the 
target does not support excess precision which may result in observable 
differences in complex division behavior}}
 }
+
+// This test ensures that Clang does not crash when complex element types
+// require desugaring under -complex-range=promoted. Previously, a sugared
+// typedef element type (e.g., 'typedef double a') caused a crash during
+// complex range evaluation in both Sema and CodeGen.
+typedef double a;
+_Complex double *b;
+// CHECK-LABEL: define dso_local void @DivideByComplexZero
+void DivideByComplexZero() {
+  // CHECK: fpext double {{.*}} to x86_fp80
+  // CHECK: fpext double {{.*}} to x86_fp80
+  // CHECK: fmul x86_fp80
+  // CHECK: fmul x86_fp80
+  // CHECK: fadd x86_fp80
+  // CHECK: fmul x86_fp80
+  // CHECK: fmul x86_fp80
+  // CHECK: fsub x86_fp80
+  // CHECK: fdiv x86_fp80
+  // CHECK: fdiv x86_fp80
+  // CHECK: fptrunc x86_fp80
+  // CHECK: fptrunc x86_fp80
+
+  // NOX87: call double @llvm.fabs.f64(double {{.*}})
+  // NOX87-NEXT: call double @llvm.fabs.f64(double {{.*}}
+  // NOX87-NEXT: fcmp ugt double {{.*}}, {{.*}}
+  // NOX87-NEXT: br i1 {{.*}}, label
+  // NOX87: abs_rhsr_greater_or_equal_abs_rhsi:
+  // NOX87-NEXT: fmul double
+  // NOX87-NEXT: fadd double
+  // NOX87-NEXT: fdiv double
+  // NOX87-NEXT: fmul double
+  // NOX87-NEXT: fsub double
+  // NOX87-NEXT: fdiv double
+  // NOX87-NEXT: br label {{.*}}
+  // NOX87: abs_rhsr_less_than_abs_rhsi:
+  // NOX87-NEXT: fmul double
+  // NOX87-NEXT: fadd double
+  // NOX87-NEXT: fdiv double
+  // NOX87-NEXT: fmul double
+  // NOX87-NEXT: fsub double
+  // NOX87-NEXT: fdiv double
+  // NOX87-NEXT: br label {{.*}}
+  // NOX87: complex_div:
+  // NOX87-NEXT: phi double
+  // NOX87-NEXT: phi double
+  // NOX87-NEXT: getelementptr inbounds nuw { double, double }, ptr {{.*}}, 
i32 0, i32 0
+  // NOX87-NEXT: getelementptr inbounds nuw { double, double }, ptr {{.*}}, 
i32 0, i32 1
+  // NOX87-NEXT: store double
+  // NOX87-NEXT: store double
+
+  *b /= 1.0iF * (a)0;
+}

>From 39e7c4657c972b9604ebe58d707f3a6d46755384 Mon Sep 17 00:00:00 2001
From: Zahira Ammarguellat <[email protected]>
Date: Fri, 21 Nov 2025 05:42:34 -0800
Subject: [PATCH 2/2] Addressed review comments

---
 clang/lib/CodeGen/CGExprComplex.cpp | 3 +--
 clang/lib/Sema/SemaExpr.cpp         | 4 ++--
 2 files changed, 3 insertions(+), 4 deletions(-)

diff --git a/clang/lib/CodeGen/CGExprComplex.cpp 
b/clang/lib/CodeGen/CGExprComplex.cpp
index f33e5d75296eb..bca7c30557f03 100644
--- a/clang/lib/CodeGen/CGExprComplex.cpp
+++ b/clang/lib/CodeGen/CGExprComplex.cpp
@@ -320,8 +320,7 @@ class ComplexExprEmitter
   QualType getPromotionType(FPOptionsOverride Features, QualType Ty,
                             bool IsComplexDivisor) {
     if (auto *CT = Ty->getAs<ComplexType>()) {
-      QualType ElementType =
-          CT->getElementType().getDesugaredType(CGF.getContext());
+      QualType ElementType = CT->getElementType().getCanonicalType();
       bool IsFloatingType = ElementType->isFloatingType();
       bool IsComplexRangePromoted = CGF.getLangOpts().getComplexRange() ==
                                     LangOptions::ComplexRangeKind::CX_Promoted;
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index ea7937d551ddb..d3c2cc559ea20 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -10726,13 +10726,13 @@ static void DetectPrecisionLossInComplexDivision(Sema 
&S, QualType DivisorTy,
   if (!CT)
     return;
 
-  ASTContext &Ctx = S.getASTContext();
-  QualType ElementType = CT->getElementType().getDesugaredType(Ctx);
+  QualType ElementType = CT->getElementType().getCanonicalType();
   bool IsComplexRangePromoted = S.getLangOpts().getComplexRange() ==
                                 LangOptions::ComplexRangeKind::CX_Promoted;
   if (!ElementType->isFloatingType() || !IsComplexRangePromoted)
     return;
 
+  ASTContext &Ctx = S.getASTContext();
   QualType HigherElementType = Ctx.GetHigherPrecisionFPType(ElementType);
   const llvm::fltSemantics &ElementTypeSemantics =
       Ctx.getFloatTypeSemantics(ElementType);

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to