summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn McCall <rjmccall@apple.com>2010-03-12 23:14:13 +0000
committerJohn McCall <rjmccall@apple.com>2010-03-12 23:14:13 +0000
commit44c064be730e44c5994ddde4e312dcd628438af0 (patch)
tree60320510a04841bf30b3909e23234a5a707adf78
parentf6442f80cbb700877631534fe6eb0d69e2839eec (diff)
downloadbcm5719-llvm-44c064be730e44c5994ddde4e312dcd628438af0.tar.gz
bcm5719-llvm-44c064be730e44c5994ddde4e312dcd628438af0.zip
Check compatibility of vector types using their canonicalizations.
Fixes an assertion arising C overload analysis, but really I can't imagine that this wouldn't cause a thousand other uncaught failures. Fixes PR6600. llvm-svn: 98400
-rw-r--r--clang/lib/AST/ASTContext.cpp3
-rw-r--r--clang/test/Sema/overloadable.c11
2 files changed, 12 insertions, 2 deletions
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index ea121165fc2..c64f97a97f1 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -4736,7 +4736,8 @@ QualType ASTContext::mergeTypes(QualType LHS, QualType RHS) {
return QualType();
case Type::Vector:
// FIXME: The merged type should be an ExtVector!
- if (areCompatVectorTypes(LHS->getAs<VectorType>(), RHS->getAs<VectorType>()))
+ if (areCompatVectorTypes(LHSCan->getAs<VectorType>(),
+ RHSCan->getAs<VectorType>()))
return LHS;
return QualType();
case Type::ObjCInterface: {
diff --git a/clang/test/Sema/overloadable.c b/clang/test/Sema/overloadable.c
index ff631ed9c85..28c3e4cf8c9 100644
--- a/clang/test/Sema/overloadable.c
+++ b/clang/test/Sema/overloadable.c
@@ -50,4 +50,13 @@ void test_promote(short* sp) {
promote(sp); // expected-error{{call to unavailable function 'promote'}}
}
-
+// PR6600
+typedef double Double;
+typedef Double DoubleVec __attribute__((vector_size(16)));
+typedef int Int;
+typedef Int IntVec __attribute__((vector_size(16)));
+double magnitude(DoubleVec) __attribute__((__overloadable__));
+double magnitude(IntVec) __attribute__((__overloadable__));
+double test_p6600(DoubleVec d) {
+ return magnitude(d) * magnitude(d);
+}
OpenPOWER on IntegriCloud