add sema support for complex integer types


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@41232 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/Sema/SemaType.cpp b/Sema/SemaType.cpp
index a1e9e1c..cc37055 100644
--- a/Sema/SemaType.cpp
+++ b/Sema/SemaType.cpp
@@ -38,36 +38,45 @@
       return Ctx.UnsignedCharTy;
     }
   case DeclSpec::TST_unspecified:  // Unspecific typespec defaults to int.
-  case DeclSpec::TST_int:
+  case DeclSpec::TST_int: {
+    QualType Result;
     if (DS.getTypeSpecSign() != DeclSpec::TSS_unsigned) {
       switch (DS.getTypeSpecWidth()) {
-      case DeclSpec::TSW_unspecified: return Ctx.IntTy;
-      case DeclSpec::TSW_short:       return Ctx.ShortTy;
-      case DeclSpec::TSW_long:        return Ctx.LongTy;
-      case DeclSpec::TSW_longlong:    return Ctx.LongLongTy;
+      case DeclSpec::TSW_unspecified: Result = Ctx.IntTy; break;
+      case DeclSpec::TSW_short:       Result = Ctx.ShortTy; break;
+      case DeclSpec::TSW_long:        Result = Ctx.LongTy; break;
+      case DeclSpec::TSW_longlong:    Result = Ctx.LongLongTy; break;
       }
     } else {
       switch (DS.getTypeSpecWidth()) {
-      case DeclSpec::TSW_unspecified: return Ctx.UnsignedIntTy;
-      case DeclSpec::TSW_short:       return Ctx.UnsignedShortTy;
-      case DeclSpec::TSW_long:        return Ctx.UnsignedLongTy;
-      case DeclSpec::TSW_longlong:    return Ctx.UnsignedLongLongTy;
+      case DeclSpec::TSW_unspecified: Result = Ctx.UnsignedIntTy; break;
+      case DeclSpec::TSW_short:       Result = Ctx.UnsignedShortTy; break;
+      case DeclSpec::TSW_long:        Result = Ctx.UnsignedLongTy; break;
+      case DeclSpec::TSW_longlong:    Result = Ctx.UnsignedLongLongTy; break;
       }
     }
+    // Handle complex integer types.
+    if (DS.getTypeSpecComplex() == DeclSpec::TSC_unspecified)
+      return Result;
+    assert(DS.getTypeSpecComplex() == DeclSpec::TSC_complex &&
+           "FIXME: imaginary types not supported yet!");
+    return Ctx.getComplexType(Result);
+  }
   case DeclSpec::TST_float:
     if (DS.getTypeSpecComplex() == DeclSpec::TSC_unspecified)
       return Ctx.FloatTy;
     assert(DS.getTypeSpecComplex() == DeclSpec::TSC_complex &&
            "FIXME: imaginary types not supported yet!");
-    return Ctx.FloatComplexTy;
+    return Ctx.getComplexType(Ctx.FloatTy);
     
   case DeclSpec::TST_double: {
     bool isLong = DS.getTypeSpecWidth() == DeclSpec::TSW_long;
+    QualType T = isLong ? Ctx.LongDoubleTy : Ctx.DoubleTy;
     if (DS.getTypeSpecComplex() == DeclSpec::TSC_unspecified)
-      return isLong ? Ctx.LongDoubleTy : Ctx.DoubleTy;
+      return T;
     assert(DS.getTypeSpecComplex() == DeclSpec::TSC_complex &&
            "FIXME: imaginary types not supported yet!");
-    return isLong ? Ctx.LongDoubleComplexTy : Ctx.DoubleComplexTy;
+    return Ctx.getComplexType(T);
   }
   case DeclSpec::TST_bool:         // _Bool or bool
     return Ctx.BoolTy;