[Sema] Use the canonical type in function isVector
authorAkira Hatanaka <ahatanaka@apple.com>
Fri, 22 Nov 2019 20:26:54 +0000 (12:26 -0800)
committerAkira Hatanaka <ahatanaka@apple.com>
Fri, 22 Nov 2019 20:57:24 +0000 (12:57 -0800)
This fixes an assertion in Sema::CreateBuiltinBinOp that fails when one
of the vector operand's element type is a typedef of __fp16.

rdar://problem/55983556

clang/lib/Sema/SemaExpr.cpp
clang/test/Sema/fp16vec-sema.c

index 3be8af1..63a189a 100644 (file)
@@ -8155,7 +8155,7 @@ Sema::CheckAssignmentConstraints(SourceLocation Loc,
 /// type ElementType.
 static bool isVector(QualType QT, QualType ElementType) {
   if (const VectorType *VT = QT->getAs<VectorType>())
-    return VT->getElementType() == ElementType;
+    return VT->getElementType().getCanonicalType() == ElementType;
   return false;
 }
 
index aefb5f8..3d02822 100644 (file)
@@ -4,6 +4,7 @@ typedef __fp16 half4 __attribute__ ((vector_size (8)));
 typedef float float4 __attribute__ ((vector_size (16)));
 typedef short short4 __attribute__ ((vector_size (8)));
 typedef int int4 __attribute__ ((vector_size (16)));
+typedef __fp16 float16_t;
 
 half4 hv0, hv1;
 float4 fv0, fv1;
@@ -49,3 +50,9 @@ void testFP16Vec(int c) {
   hv0++; // expected-error{{cannot increment value of type}}
   ++hv0; // expected-error{{cannot increment value of type}}
 }
+
+void testTypeDef() {
+  __fp16 t0 __attribute__((vector_size (8)));
+  float16_t t1 __attribute__((vector_size (8)));
+  t1 = t0;
+}