]> granicus.if.org Git - clang/commitdiff
PR15966: don't get confused by a complex integer -> complex integer conversion
authorRichard Smith <richard-llvm@metafoo.co.uk>
Fri, 10 May 2013 20:29:50 +0000 (20:29 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Fri, 10 May 2013 20:29:50 +0000 (20:29 +0000)
and misclassify it as a complex-real conversion.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@181626 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaOverload.cpp
test/SemaCXX/complex-overload.cpp

index 3461f91ff316970f9e94de0fcdec1eab43fe27c4..dbe151c7828d08daebb377c47284bd56c5dd3142 100644 (file)
@@ -1591,7 +1591,7 @@ static bool IsStandardConversion(Sema &S, Expr* From, QualType ToType,
     // Integral conversions (C++ 4.7).
     SCS.Second = ICK_Integral_Conversion;
     FromType = ToType.getUnqualifiedType();
-  } else if (FromType->isAnyComplexType() && ToType->isComplexType()) {
+  } else if (FromType->isAnyComplexType() && ToType->isAnyComplexType()) {
     // Complex conversions (C99 6.3.1.6)
     SCS.Second = ICK_Complex_Conversion;
     FromType = ToType.getUnqualifiedType();
index 719a850dbf77507b87bba04fbd099b290f17308b..1381968751af45e18517aa2a3e55f9f740ac082c 100644 (file)
@@ -42,9 +42,15 @@ void test_promote_or_convert2(float _Complex fc) {
   int *cp = promote_or_convert2(fc);
 }
 
-char *promote_or_convert3(int _Complex);
-int *promote_or_convert3(long _Complex);
+char *promote_or_convert3(int _Complex); // expected-note {{candidate}}
+int *promote_or_convert3(long _Complex); // expected-note {{candidate}}
 
 void test_promote_or_convert3(short _Complex sc) {
-  char *cp = promote_or_convert3(sc);
+  char *cp1 = promote_or_convert3(sc);
+  char *cp2 = promote_or_convert3(1i);
+  int *cp3 = promote_or_convert3(1il);
+  int *cp4 = promote_or_convert3(1ill); // expected-error {{ambiguous}}
 }
+
+char &convert4(short _Complex);
+char &test_convert4 = convert4(1i);