[clang] a6150b4 - [Sema] Use the canonical type in function isVector

Akira Hatanaka via cfe-commits cfe-commits at lists.llvm.org
Fri Nov 22 12:57:32 PST 2019


Author: Akira Hatanaka
Date: 2019-11-22T12:57:24-08:00
New Revision: a6150b48cea00ab31e9335cc73770327acc4cb3a

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

LOG: [Sema] Use the canonical type in function isVector

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

Added: 
    

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

Removed: 
    


################################################################################
diff  --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index 3be8af1dd9e7..63a189a102fc 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -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;
 }
 

diff  --git a/clang/test/Sema/fp16vec-sema.c b/clang/test/Sema/fp16vec-sema.c
index aefb5f86a14b..3d028224d22d 100644
--- a/clang/test/Sema/fp16vec-sema.c
+++ b/clang/test/Sema/fp16vec-sema.c
@@ -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;
+}


        


More information about the cfe-commits mailing list