[clang] 5547919 - Fix a crash when casting _Complex and ignoring the results.

Aaron Ballman via cfe-commits cfe-commits at lists.llvm.org
Tue Jan 28 10:06:05 PST 2020


Author: Aaron Ballman
Date: 2020-01-28T13:05:56-05:00
New Revision: 554791928088d6139e0fb3480d79cd76ea59198f

URL: https://github.com/llvm/llvm-project/commit/554791928088d6139e0fb3480d79cd76ea59198f
DIFF: https://github.com/llvm/llvm-project/commit/554791928088d6139e0fb3480d79cd76ea59198f.diff

LOG: Fix a crash when casting _Complex and ignoring the results.

Performing a cast where the result is ignored caused Clang to crash when
performing codegen for the conversion:

  _Complex int a;
  void fn1() { (_Complex double) a; }

This patch addresses the crash by not trying to emit the scalar conversions,
causing it to be a noop. Fixes PR44624.

Added: 
    

Modified: 
    clang/lib/CodeGen/CGExprComplex.cpp
    clang/test/CodeGen/complex-convert.c

Removed: 
    


################################################################################
diff  --git a/clang/lib/CodeGen/CGExprComplex.cpp b/clang/lib/CodeGen/CGExprComplex.cpp
index f7a4e9e94712..4c527867bb9f 100644
--- a/clang/lib/CodeGen/CGExprComplex.cpp
+++ b/clang/lib/CodeGen/CGExprComplex.cpp
@@ -431,8 +431,10 @@ ComplexPairTy ComplexExprEmitter::EmitComplexToComplexCast(ComplexPairTy Val,
   // C99 6.3.1.6: When a value of complex type is converted to another
   // complex type, both the real and imaginary parts follow the conversion
   // rules for the corresponding real types.
-  Val.first = CGF.EmitScalarConversion(Val.first, SrcType, DestType, Loc);
-  Val.second = CGF.EmitScalarConversion(Val.second, SrcType, DestType, Loc);
+  if (Val.first)
+    Val.first = CGF.EmitScalarConversion(Val.first, SrcType, DestType, Loc);
+  if (Val.second)
+    Val.second = CGF.EmitScalarConversion(Val.second, SrcType, DestType, Loc);
   return Val;
 }
 

diff  --git a/clang/test/CodeGen/complex-convert.c b/clang/test/CodeGen/complex-convert.c
index 5d2e9d706bdc..6d0291aa4274 100644
--- a/clang/test/CodeGen/complex-convert.c
+++ b/clang/test/CodeGen/complex-convert.c
@@ -722,3 +722,8 @@ void foo(signed char sc, unsigned char uc, signed long long sll,
   // CHECK-NEXT: store i[[LLSIZE]] %[[VAR441]], i[[LLSIZE]]* %[[VAR443]]
 }
 
+// This code used to cause a crash; test that it no longer does so.
+_Complex int a;
+void pr44624(void) {
+  (_Complex double) a;
+}


        


More information about the cfe-commits mailing list