<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On 8 August 2017 at 16:18, Tim Northover via cfe-commits <span dir="ltr"><<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Author: tnorthover<br>
Date: Tue Aug  8 16:18:05 2017<br>
New Revision: 310427<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=310427&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=310427&view=rev</a><br>
Log:<br>
Sema: disable implicit conversion from _Complex to real types in C++.<br>
<br>
Converting a _Complex type to a real one simply discards the imaginary part.<br>
This can easily lead to loss of information so for safety (and GCC<br>
compatibility) this patch disallows that when the conversion would be implicit.<br>
<br>
The one exception is bool, which actually compares both real and imaginary<br>
parts and so is safe.<br></blockquote><div><br></div><div>This change is missing the corresponding change to formation of initialization sequences. The result is surprising behavior in overload resolution:</div><div><br></div><div><div>_Complex double cd;</div><div><br></div><div>double d = cd; // error, can't convert</div><div><br></div><div>void f(double); // #1</div><div>int f(...);   // #2</div><div>int n = f(cd); // error, selects #1 instead of #2</div></div><div><br></div><div>Note that GCC selects overload #2 in the above case.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
Added:<br>
    cfe/trunk/test/SemaCXX/<wbr>complex-conversion.cpp<br>
Modified:<br>
    cfe/trunk/include/clang/Basic/<wbr>DiagnosticSemaKinds.td<br>
    cfe/trunk/lib/Sema/<wbr>SemaChecking.cpp<br>
    cfe/trunk/lib/Sema/SemaExpr.<wbr>cpp<br>
    cfe/trunk/test/CodeGenCXX/<wbr>stmtexpr.cpp<br>
    cfe/trunk/test/OpenMP/atomic_<wbr>capture_codegen.cpp<br>
    cfe/trunk/test/OpenMP/atomic_<wbr>update_codegen.cpp<br>
    cfe/trunk/test/SemaCXX/<wbr>complex-overload.cpp<br>
    cfe/trunk/test/SemaCXX/<wbr>integer-overflow.cpp<br>
    cfe/trunk/test/SemaCXX/warn-<wbr>absolute-value.cpp<br>
<br>
Modified: cfe/trunk/include/clang/Basic/<wbr>DiagnosticSemaKinds.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=310427&r1=310426&r2=310427&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/include/<wbr>clang/Basic/<wbr>DiagnosticSemaKinds.td?rev=<wbr>310427&r1=310426&r2=310427&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/include/clang/Basic/<wbr>DiagnosticSemaKinds.td (original)<br>
+++ cfe/trunk/include/clang/Basic/<wbr>DiagnosticSemaKinds.td Tue Aug  8 16:18:05 2017<br>
@@ -3087,6 +3087,8 @@ def warn_impcast_vector_scalar : Warning<br>
 def warn_impcast_complex_scalar : Warning<<br>
   "implicit conversion discards imaginary component: %0 to %1">,<br>
   InGroup<Conversion>, DefaultIgnore;<br>
+def err_impcast_complex_scalar : Error<<br>
+  "implicit conversion from %0 to %1 is not permitted in C++">;<br>
 def warn_impcast_float_precision : Warning<<br>
   "implicit conversion loses floating-point precision: %0 to %1">,<br>
   InGroup<Conversion>, DefaultIgnore;<br>
<br>
Modified: cfe/trunk/lib/Sema/<wbr>SemaChecking.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaChecking.cpp?rev=310427&r1=310426&r2=310427&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/Sema/<wbr>SemaChecking.cpp?rev=310427&<wbr>r1=310426&r2=310427&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/lib/Sema/<wbr>SemaChecking.cpp (original)<br>
+++ cfe/trunk/lib/Sema/<wbr>SemaChecking.cpp Tue Aug  8 16:18:05 2017<br>
@@ -9431,10 +9431,13 @@ void CheckImplicitConversion(Sema &S, Ex<br>
   // Strip complex types.<br>
   if (isa<ComplexType>(Source)) {<br>
     if (!isa<ComplexType>(Target)) {<br>
-      if (S.SourceMgr.isInSystemMacro(<wbr>CC))<br>
+      if (S.SourceMgr.isInSystemMacro(<wbr>CC) || Target->isBooleanType())<br>
         return;<br>
<br>
-      return DiagnoseImpCast(S, E, T, CC, diag::warn_impcast_complex_<wbr>scalar);<br>
+      return DiagnoseImpCast(S, E, T, CC,<br>
+                             S.getLangOpts().CPlusPlus<br>
+                                 ? diag::err_impcast_complex_<wbr>scalar<br>
+                                 : diag::warn_impcast_complex_<wbr>scalar);<br>
     }<br>
<br>
     Source = cast<ComplexType>(Source)-><wbr>getElementType().getTypePtr();<br>
<br>
Modified: cfe/trunk/lib/Sema/SemaExpr.<wbr>cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=310427&r1=310426&r2=310427&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/Sema/<wbr>SemaExpr.cpp?rev=310427&r1=<wbr>310426&r2=310427&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/lib/Sema/SemaExpr.<wbr>cpp (original)<br>
+++ cfe/trunk/lib/Sema/SemaExpr.<wbr>cpp Tue Aug  8 16:18:05 2017<br>
@@ -7530,6 +7530,12 @@ Sema::<wbr>CheckAssignmentConstraints(<wbr>QualTyp<br>
   if (unsupportedTypeConversion(*<wbr>this, LHSType, RHSType))<br>
     return Incompatible;<br>
<br>
+  // Disallow assigning a _Complex to a real type in C++ mode since it simply<br>
+  // discards the imaginary part.<br>
+  if (getLangOpts().CPlusPlus && RHSType->getAs<ComplexType>() &&<br>
+      !LHSType->getAs<ComplexType>()<wbr>)<br>
+    return Incompatible;<br>
+<br>
   // Arithmetic conversions.<br>
   if (LHSType->isArithmeticType() && RHSType->isArithmeticType() &&<br>
       !(getLangOpts().CPlusPlus && LHSType->isEnumeralType())) {<br>
<br>
Modified: cfe/trunk/test/CodeGenCXX/<wbr>stmtexpr.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/stmtexpr.cpp?rev=310427&r1=310426&r2=310427&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/<wbr>CodeGenCXX/stmtexpr.cpp?rev=<wbr>310427&r1=310426&r2=310427&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/CodeGenCXX/<wbr>stmtexpr.cpp (original)<br>
+++ cfe/trunk/test/CodeGenCXX/<wbr>stmtexpr.cpp Tue Aug  8 16:18:05 2017<br>
@@ -173,7 +173,7 @@ extern "C" int cleanup_exit_lvalue_local<br>
 _Complex float bar_complex(A, int);<br>
 extern "C" int cleanup_exit_complex(bool b) {<br>
   _Complex float v = bar_complex(A(1), ({ if (b) return 42; 13; }));<br>
-  return v;<br>
+  return (float)v;<br>
 }<br>
<br>
 // CHECK-LABEL: define{{.*}} i32 @cleanup_exit_complex({{.*}})<br>
<br>
Modified: cfe/trunk/test/OpenMP/atomic_<wbr>capture_codegen.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/atomic_capture_codegen.cpp?rev=310427&r1=310426&r2=310427&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/OpenMP/<wbr>atomic_capture_codegen.cpp?<wbr>rev=310427&r1=310426&r2=<wbr>310427&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/OpenMP/atomic_<wbr>capture_codegen.cpp (original)<br>
+++ cfe/trunk/test/OpenMP/atomic_<wbr>capture_codegen.cpp Tue Aug  8 16:18:05 2017<br>
@@ -611,50 +611,6 @@ int main() {<br>
 // CHECK: store i8 [[DESIRED_I8]], i8* @{{.+}},<br>
 #pragma omp atomic capture<br>
   {bx = civ - bx; bv = bx;}<br>
-// CHECK: [[EXPR_RE:%.+]] = load float, float* getelementptr inbounds ({ float, float }, { float, float }* @{{.+}}, i32 0, i32 0)<br>
-// CHECK: [[EXPR_IM:%.+]] = load float, float* getelementptr inbounds ({ float, float }, { float, float }* @{{.+}}, i32 0, i32 1)<br>
-// CHECK: [[X:%.+]] = load atomic i16, i16* [[X_ADDR:@.+]] monotonic<br>
-// CHECK: br label %[[CONT:.+]]<br>
-// CHECK: [[CONT]]<br>
-// CHECK: [[EXPECTED:%.+]] = phi i16 [ [[X]], %{{.+}} ], [ [[OLD_X:%.+]], %[[CONT]] ]<br>
-// CHECK: [[CONV:%.+]] = zext i16 [[EXPECTED]] to i32<br>
-// CHECK: [[X_RVAL:%.+]] = sitofp i32 [[CONV]] to float<br>
-// <Skip checks for complex calculations><br>
-// CHECK: [[X_RE_ADDR:%.+]] = getelementptr inbounds { float, float }, { float, float }* [[TEMP:%.+]], i32 0, i32 0<br>
-// CHECK: [[X_RE:%.+]] = load float, float* [[X_RE_ADDR]]<br>
-// CHECK: [[X_IM_ADDR:%.+]] = getelementptr inbounds { float, float }, { float, float }* [[TEMP]], i32 0, i32 1<br>
-// CHECK: [[X_IM:%.+]] = load float, float* [[X_IM_ADDR]]<br>
-// CHECK: [[NEW:%.+]] = fptoui float [[X_RE]] to i16<br>
-// CHECK: store i16 [[NEW]], i16* [[TEMP:%.+]],<br>
-// CHECK: [[DESIRED:%.+]] = load i16, i16* [[TEMP]],<br>
-// CHECK: [[RES:%.+]] = cmpxchg i16* [[X_ADDR]], i16 [[EXPECTED]], i16 [[DESIRED]] monotonic monotonic<br>
-// CHECK: [[OLD_X]] = extractvalue { i16, i1 } [[RES]], 0<br>
-// CHECK: [[SUCCESS_FAIL:%.+]] = extractvalue { i16, i1 } [[RES]], 1<br>
-// CHECK: br i1 [[SUCCESS_FAIL]], label %[[EXIT:.+]], label %[[CONT]]<br>
-// CHECK: [[EXIT]]<br>
-// CHECK: store i16 [[NEW]], i16* @{{.+}},<br>
-#pragma omp atomic capture<br>
-  usv = usx /= cfv;<br>
-// CHECK: [[EXPR_RE:%.+]] = load double, double* getelementptr inbounds ({ double, double }, { double, double }* @{{.+}}, i32 0, i32 0)<br>
-// CHECK: [[EXPR_IM:%.+]] = load double, double* getelementptr inbounds ({ double, double }, { double, double }* @{{.+}}, i32 0, i32 1)<br>
-// CHECK: [[X:%.+]] = load atomic i64, i64* [[X_ADDR:@.+]] monotonic<br>
-// CHECK: br label %[[CONT:.+]]<br>
-// CHECK: [[CONT]]<br>
-// CHECK: [[EXPECTED:%.+]] = phi i64 [ [[X]], %{{.+}} ], [ [[OLD_X:%.+]], %[[CONT]] ]<br>
-// CHECK: [[X_RVAL:%.+]] = sitofp i64 [[EXPECTED]] to double<br>
-// CHECK: [[ADD_RE:%.+]] = fadd double [[X_RVAL]], [[EXPR_RE]]<br>
-// CHECK: [[ADD_IM:%.+]] = fadd double 0.000000e+00, [[EXPR_IM]]<br>
-// CHECK: [[DESIRED:%.+]] = fptosi double [[ADD_RE]] to i64<br>
-// CHECK: store i64 [[DESIRED]], i64* [[TEMP:%.+]],<br>
-// CHECK: [[DESIRED:%.+]] = load i64, i64* [[TEMP]],<br>
-// CHECK: [[RES:%.+]] = cmpxchg i64* [[X_ADDR]], i64 [[EXPECTED]], i64 [[DESIRED]] monotonic monotonic<br>
-// CHECK: [[OLD_X]] = extractvalue { i64, i1 } [[RES]], 0<br>
-// CHECK: [[SUCCESS_FAIL:%.+]] = extractvalue { i64, i1 } [[RES]], 1<br>
-// CHECK: br i1 [[SUCCESS_FAIL]], label %[[EXIT:.+]], label %[[CONT]]<br>
-// CHECK: [[EXIT]]<br>
-// CHECK: store i64 [[EXPECTED]], i64* @{{.+}},<br>
-#pragma omp atomic capture<br>
-  {llv = llx; llx += cdv;}<br>
 // CHECK: [[IDX:%.+]] = load i16, i16* @{{.+}}<br>
 // CHECK: load i8, i8*<br>
 // CHECK: [[VEC_ITEM_VAL:%.+]] = zext i1 %{{.+}} to i32<br>
<br>
Modified: cfe/trunk/test/OpenMP/atomic_<wbr>update_codegen.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/atomic_update_codegen.cpp?rev=310427&r1=310426&r2=310427&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/OpenMP/<wbr>atomic_update_codegen.cpp?rev=<wbr>310427&r1=310426&r2=310427&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/OpenMP/atomic_<wbr>update_codegen.cpp (original)<br>
+++ cfe/trunk/test/OpenMP/atomic_<wbr>update_codegen.cpp Tue Aug  8 16:18:05 2017<br>
@@ -554,48 +554,6 @@ int main() {<br>
 // CHECK: [[EXIT]]<br>
 #pragma omp atomic<br>
   bx = civ - bx;<br>
-// CHECK: [[EXPR_RE:%.+]] = load float, float* getelementptr inbounds ({ float, float }, { float, float }* @{{.+}}, i32 0, i32 0)<br>
-// CHECK: [[EXPR_IM:%.+]] = load float, float* getelementptr inbounds ({ float, float }, { float, float }* @{{.+}}, i32 0, i32 1)<br>
-// CHECK: [[X:%.+]] = load atomic i16, i16* [[X_ADDR:@.+]] monotonic<br>
-// CHECK: br label %[[CONT:.+]]<br>
-// CHECK: [[CONT]]<br>
-// CHECK: [[EXPECTED:%.+]] = phi i16 [ [[X]], %{{.+}} ], [ [[OLD_X:%.+]], %[[CONT]] ]<br>
-// CHECK: [[CONV:%.+]] = zext i16 [[EXPECTED]] to i32<br>
-// CHECK: [[X_RVAL:%.+]] = sitofp i32 [[CONV]] to float<br>
-// <Skip checks for complex calculations><br>
-// CHECK: [[X_RE_ADDR:%.+]] = getelementptr inbounds { float, float }, { float, float }* [[TEMP:%.+]], i32 0, i32 0<br>
-// CHECK: [[X_RE:%.+]] = load float, float* [[X_RE_ADDR]]<br>
-// CHECK: [[X_IM_ADDR:%.+]] = getelementptr inbounds { float, float }, { float, float }* [[TEMP]], i32 0, i32 1<br>
-// CHECK: [[X_IM:%.+]] = load float, float* [[X_IM_ADDR]]<br>
-// CHECK: [[DESIRED:%.+]] = fptoui float [[X_RE]] to i16<br>
-// CHECK: store i16 [[DESIRED]], i16* [[TEMP:%.+]]<br>
-// CHECK: [[DESIRED:%.+]] = load i16, i16* [[TEMP]]<br>
-// CHECK: [[RES:%.+]] = cmpxchg i16* [[X_ADDR]], i16 [[EXPECTED]], i16 [[DESIRED]] monotonic monotonic<br>
-// CHECK: [[OLD_X]] = extractvalue { i16, i1 } [[RES]], 0<br>
-// CHECK: [[SUCCESS_FAIL:%.+]] = extractvalue { i16, i1 } [[RES]], 1<br>
-// CHECK: br i1 [[SUCCESS_FAIL]], label %[[EXIT:.+]], label %[[CONT]]<br>
-// CHECK: [[EXIT]]<br>
-#pragma omp atomic update<br>
-  usx /= cfv;<br>
-// CHECK: [[EXPR_RE:%.+]] = load double, double* getelementptr inbounds ({ double, double }, { double, double }* @{{.+}}, i32 0, i32 0)<br>
-// CHECK: [[EXPR_IM:%.+]] = load double, double* getelementptr inbounds ({ double, double }, { double, double }* @{{.+}}, i32 0, i32 1)<br>
-// CHECK: [[X:%.+]] = load atomic i64, i64* [[X_ADDR:@.+]] monotonic<br>
-// CHECK: br label %[[CONT:.+]]<br>
-// CHECK: [[CONT]]<br>
-// CHECK: [[EXPECTED:%.+]] = phi i64 [ [[X]], %{{.+}} ], [ [[OLD_X:%.+]], %[[CONT]] ]<br>
-// CHECK: [[X_RVAL:%.+]] = sitofp i64 [[EXPECTED]] to double<br>
-// CHECK: [[ADD_RE:%.+]] = fadd double [[X_RVAL]], [[EXPR_RE]]<br>
-// CHECK: [[ADD_IM:%.+]] = fadd double 0.000000e+00, [[EXPR_IM]]<br>
-// CHECK: [[DESIRED:%.+]] = fptosi double [[ADD_RE]] to i64<br>
-// CHECK: store i64 [[DESIRED]], i64* [[TEMP:%.+]]<br>
-// CHECK: [[DESIRED:%.+]] = load i64, i64* [[TEMP]]<br>
-// CHECK: [[RES:%.+]] = cmpxchg i64* [[X_ADDR]], i64 [[EXPECTED]], i64 [[DESIRED]] monotonic monotonic<br>
-// CHECK: [[OLD_X]] = extractvalue { i64, i1 } [[RES]], 0<br>
-// CHECK: [[SUCCESS_FAIL:%.+]] = extractvalue { i64, i1 } [[RES]], 1<br>
-// CHECK: br i1 [[SUCCESS_FAIL]], label %[[EXIT:.+]], label %[[CONT]]<br>
-// CHECK: [[EXIT]]<br>
-#pragma omp atomic<br>
-  llx += cdv;<br>
 // CHECK: [[IDX:%.+]] = load i16, i16* @{{.+}}<br>
 // CHECK: load i8, i8*<br>
 // CHECK: [[VEC_ITEM_VAL:%.+]] = zext i1 %{{.+}} to i32<br>
<br>
Added: cfe/trunk/test/SemaCXX/<wbr>complex-conversion.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/complex-conversion.cpp?rev=310427&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/<wbr>SemaCXX/complex-conversion.<wbr>cpp?rev=310427&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/SemaCXX/<wbr>complex-conversion.cpp (added)<br>
+++ cfe/trunk/test/SemaCXX/<wbr>complex-conversion.cpp Tue Aug  8 16:18:05 2017<br>
@@ -0,0 +1,18 @@<br>
+// RUN: %clang_cc1 -fsyntax-only -verify %s<br>
+<br>
+template<typename T> void take(T);<br>
+<br>
+void func(float Real, _Complex float Complex) {<br>
+  Real += Complex; // expected-error {{assigning to 'float' from incompatible type '_Complex float'}}<br>
+  Real += (float)Complex;<br>
+<br>
+  Real = Complex; // expected-error {{implicit conversion from '_Complex float' to 'float' is not permitted in C++}}<br>
+  Real = (float)Complex;<br>
+<br>
+  take<float>(Complex); // expected-error {{implicit conversion from '_Complex float' to 'float' is not permitted in C++}}<br>
+  take<double>(1.0i); // expected-error {{implicit conversion from '_Complex double' to 'double' is not permitted in C++}}<br>
+  take<_Complex float>(Complex);<br>
+<br>
+  // Conversion to bool doesn't actually discard the imaginary part.<br>
+  take<bool>(Complex);<br>
+}<br>
<br>
Modified: cfe/trunk/test/SemaCXX/<wbr>complex-overload.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/complex-overload.cpp?rev=310427&r1=310426&r2=310427&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/<wbr>SemaCXX/complex-overload.cpp?<wbr>rev=310427&r1=310426&r2=<wbr>310427&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/SemaCXX/<wbr>complex-overload.cpp (original)<br>
+++ cfe/trunk/test/SemaCXX/<wbr>complex-overload.cpp Tue Aug  8 16:18:05 2017<br>
@@ -4,9 +4,10 @@ char *foo(float);<br>
 void test_foo_1(float fv, double dv, float _Complex fc, double _Complex dc) {<br>
   char *cp1 = foo(fv);<br>
   char *cp2 = foo(dv);<br>
-  // Note: GCC and EDG reject these two, but they are valid C99 conversions<br>
-  char *cp3 = foo(fc);<br>
-  char *cp4 = foo(dc);<br>
+  // Note: GCC and EDG reject these two, they are valid C99 conversions but<br>
+  // shouldn't be accepted in C++ because the result is surprising.<br>
+  char *cp3 = foo(fc); // expected-error {{implicit conversion from '_Complex float' to 'float' is not permitted in C++}}<br>
+  char *cp4 = foo(dc); // expected-error {{implicit conversion from '_Complex double' to 'float' is not permitted in C++}}<br>
 }<br>
<br>
 int *foo(float _Complex);<br>
<br>
Modified: cfe/trunk/test/SemaCXX/<wbr>integer-overflow.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/integer-overflow.cpp?rev=310427&r1=310426&r2=310427&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/<wbr>SemaCXX/integer-overflow.cpp?<wbr>rev=310427&r1=310426&r2=<wbr>310427&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/SemaCXX/<wbr>integer-overflow.cpp (original)<br>
+++ cfe/trunk/test/SemaCXX/<wbr>integer-overflow.cpp Tue Aug  8 16:18:05 2017<br>
@@ -164,7 +164,7 @@ uint64_t check_integer_overflows(int i)<br>
 // expected-warning@+3 {{array index 536870912 is past the end of the array (which contains 10 elements)}}<br>
 // expected-note@+1 {{array 'a' declared here}}<br>
   uint64_t a[10];<br>
-  a[4608 * 1024 * 1024] = 1i;<br>
+  a[4608 * 1024 * 1024] = 1;<br>
<br>
 // expected-warning@+1 2{{overflow in expression; result is 536870912 with type 'int'}}<br>
   return ((4608 * 1024 * 1024) + ((uint64_t)(4608 * 1024 * 1024)));<br>
<br>
Modified: cfe/trunk/test/SemaCXX/warn-<wbr>absolute-value.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/warn-absolute-value.cpp?rev=310427&r1=310426&r2=310427&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/<wbr>SemaCXX/warn-absolute-value.<wbr>cpp?rev=310427&r1=310426&r2=<wbr>310427&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/SemaCXX/warn-<wbr>absolute-value.cpp (original)<br>
+++ cfe/trunk/test/SemaCXX/warn-<wbr>absolute-value.cpp Tue Aug  8 16:18:05 2017<br>
@@ -448,94 +448,16 @@ void test_long_double(long double x) {<br>
 }<br>
<br>
 void test_complex_float(_Complex float x) {<br>
-  (void)abs(x);<br>
-  // expected-warning@-1 {{using integer absolute value function 'abs' when argument is of complex type}}<br>
-  // expected-note@-2 {{use function 'cabsf' instead}}<br>
-  // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:<wbr>9-[[@LINE-3]]:12}:"cabsf"<br>
-  (void)labs(x);<br>
-  // expected-warning@-1 {{using integer absolute value function 'labs' when argument is of complex type}}<br>
-  // expected-note@-2 {{use function 'cabsf' instead}}<br>
-  // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:<wbr>9-[[@LINE-3]]:13}:"cabsf"<br>
-  (void)llabs(x);<br>
-  // expected-warning@-1 {{using integer absolute value function 'llabs' when argument is of complex type}}<br>
-  // expected-note@-2 {{use function 'cabsf' instead}}<br>
-  // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:<wbr>9-[[@LINE-3]]:14}:"cabsf"<br>
-<br>
-  (void)fabsf(x);<br>
-  // expected-warning@-1 {{using floating point absolute value function 'fabsf' when argument is of complex type}}<br>
-  // expected-note@-2 {{use function 'cabsf' instead}}<br>
-  // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:<wbr>9-[[@LINE-3]]:14}:"cabsf"<br>
-  (void)fabs(x);<br>
-  // expected-warning@-1 {{using floating point absolute value function 'fabs' when argument is of complex type}}<br>
-  // expected-note@-2 {{use function 'cabsf' instead}}<br>
-  // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:<wbr>9-[[@LINE-3]]:13}:"cabsf"<br>
-  (void)fabsl(x);<br>
-  // expected-warning@-1 {{using floating point absolute value function 'fabsl' when argument is of complex type}}<br>
-  // expected-note@-2 {{use function 'cabsf' instead}}<br>
-  // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:<wbr>9-[[@LINE-3]]:14}:"cabsf"<br>
-<br>
   (void)cabsf(x);<br>
   (void)cabs(x);<br>
   (void)cabsl(x);<br>
<br>
-  (void)__builtin_abs(x);<br>
-  // expected-warning@-1 {{using integer absolute value function '__builtin_abs' when argument is of complex type}}<br>
-  // expected-note@-2 {{use function '__builtin_cabsf' instead}}<br>
-  // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:<wbr>9-[[@LINE-3]]:22}:"__builtin_<wbr>cabsf"<br>
-  (void)__builtin_labs(x);<br>
-  // expected-warning@-1 {{using integer absolute value function '__builtin_labs' when argument is of complex type}}<br>
-  // expected-note@-2 {{use function '__builtin_cabsf' instead}}<br>
-  // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:<wbr>9-[[@LINE-3]]:23}:"__builtin_<wbr>cabsf"<br>
-  (void)__builtin_llabs(x);<br>
-  // expected-warning@-1 {{using integer absolute value function '__builtin_llabs' when argument is of complex type}}<br>
-  // expected-note@-2 {{use function '__builtin_cabsf' instead}}<br>
-  // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:<wbr>9-[[@LINE-3]]:24}:"__builtin_<wbr>cabsf"<br>
-<br>
-  (void)__builtin_fabsf(x);<br>
-  // expected-warning@-1 {{using floating point absolute value function '__builtin_fabsf' when argument is of complex type}}<br>
-  // expected-note@-2 {{use function '__builtin_cabsf' instead}}<br>
-  // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:<wbr>9-[[@LINE-3]]:24}:"__builtin_<wbr>cabsf"<br>
-  (void)__builtin_fabs(x);<br>
-  // expected-warning@-1 {{using floating point absolute value function '__builtin_fabs' when argument is of complex type}}<br>
-  // expected-note@-2 {{use function '__builtin_cabsf' instead}}<br>
-  // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:<wbr>9-[[@LINE-3]]:23}:"__builtin_<wbr>cabsf"<br>
-  (void)__builtin_fabsl(x);<br>
-  // expected-warning@-1 {{using floating point absolute value function '__builtin_fabsl' when argument is of complex type}}<br>
-  // expected-note@-2 {{use function '__builtin_cabsf' instead}}<br>
-  // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:<wbr>9-[[@LINE-3]]:24}:"__builtin_<wbr>cabsf"<br>
-<br>
   (void)__builtin_cabsf(x);<br>
   (void)__builtin_cabs(x);<br>
   (void)__builtin_cabsl(x);<br>
 }<br>
<br>
 void test_complex_double(_Complex double x) {<br>
-  (void)abs(x);<br>
-  // expected-warning@-1 {{using integer absolute value function 'abs' when argument is of complex type}}<br>
-  // expected-note@-2 {{use function 'cabs' instead}}<br>
-  // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:<wbr>9-[[@LINE-3]]:12}:"cabs"<br>
-  (void)labs(x);<br>
-  // expected-warning@-1 {{using integer absolute value function 'labs' when argument is of complex type}}<br>
-  // expected-note@-2 {{use function 'cabs' instead}}<br>
-  // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:<wbr>9-[[@LINE-3]]:13}:"cabs"<br>
-  (void)llabs(x);<br>
-  // expected-warning@-1 {{using integer absolute value function 'llabs' when argument is of complex type}}<br>
-  // expected-note@-2 {{use function 'cabs' instead}}<br>
-  // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:<wbr>9-[[@LINE-3]]:14}:"cabs"<br>
-<br>
-  (void)fabsf(x);<br>
-  // expected-warning@-1 {{using floating point absolute value function 'fabsf' when argument is of complex type}}<br>
-  // expected-note@-2 {{use function 'cabs' instead}}<br>
-  // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:<wbr>9-[[@LINE-3]]:14}:"cabs"<br>
-  (void)fabs(x);<br>
-  // expected-warning@-1 {{using floating point absolute value function 'fabs' when argument is of complex type}}<br>
-  // expected-note@-2 {{use function 'cabs' instead}}<br>
-  // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:<wbr>9-[[@LINE-3]]:13}:"cabs"<br>
-  (void)fabsl(x);<br>
-  // expected-warning@-1 {{using floating point absolute value function 'fabsl' when argument is of complex type}}<br>
-  // expected-note@-2 {{use function 'cabs' instead}}<br>
-  // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:<wbr>9-[[@LINE-3]]:14}:"cabs"<br>
-<br>
   (void)cabsf(x);<br>
   // expected-warning@-1 {{absolute value function 'cabsf' given an argument of type '_Complex double' but has parameter of type '_Complex float' which may cause truncation of value}}<br>
   // expected-note@-2 {{use function 'cabs' instead}}<br>
@@ -543,31 +465,6 @@ void test_complex_double(_Complex double<br>
   (void)cabs(x);<br>
   (void)cabsl(x);<br>
<br>
-  (void)__builtin_abs(x);<br>
-  // expected-warning@-1 {{using integer absolute value function '__builtin_abs' when argument is of complex type}}<br>
-  // expected-note@-2 {{use function '__builtin_cabs' instead}}<br>
-  // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:<wbr>9-[[@LINE-3]]:22}:"__builtin_<wbr>cabs"<br>
-  (void)__builtin_labs(x);<br>
-  // expected-warning@-1 {{using integer absolute value function '__builtin_labs' when argument is of complex type}}<br>
-  // expected-note@-2 {{use function '__builtin_cabs' instead}}<br>
-  // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:<wbr>9-[[@LINE-3]]:23}:"__builtin_<wbr>cabs"<br>
-  (void)__builtin_llabs(x);<br>
-  // expected-warning@-1 {{using integer absolute value function '__builtin_llabs' when argument is of complex type}}<br>
-  // expected-note@-2 {{use function '__builtin_cabs' instead}}<br>
-  // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:<wbr>9-[[@LINE-3]]:24}:"__builtin_<wbr>cabs"<br>
-<br>
-  (void)__builtin_fabsf(x);<br>
-  // expected-warning@-1 {{using floating point absolute value function '__builtin_fabsf' when argument is of complex type}}<br>
-  // expected-note@-2 {{use function '__builtin_cabs' instead}}<br>
-  // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:<wbr>9-[[@LINE-3]]:24}:"__builtin_<wbr>cabs"<br>
-  (void)__builtin_fabs(x);<br>
-  // expected-warning@-1 {{using floating point absolute value function '__builtin_fabs' when argument is of complex type}}<br>
-  // expected-note@-2 {{use function '__builtin_cabs' instead}}<br>
-  // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:<wbr>9-[[@LINE-3]]:23}:"__builtin_<wbr>cabs"<br>
-  (void)__builtin_fabsl(x);<br>
-  // expected-warning@-1 {{using floating point absolute value function '__builtin_fabsl' when argument is of complex type}}<br>
-  // expected-note@-2 {{use function '__builtin_cabs' instead}}<br>
-  // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:<wbr>9-[[@LINE-3]]:24}:"__builtin_<wbr>cabs"<br>
<br>
   (void)__builtin_cabsf(x);<br>
   // expected-warning@-1 {{absolute value function '__builtin_cabsf' given an argument of type '_Complex double' but has parameter of type '_Complex float' which may cause truncation of value}}<br>
@@ -578,32 +475,6 @@ void test_complex_double(_Complex double<br>
 }<br>
<br>
 void test_complex_long_double(_<wbr>Complex long double x) {<br>
-  (void)abs(x);<br>
-  // expected-warning@-1 {{using integer absolute value function 'abs' when argument is of complex type}}<br>
-  // expected-note@-2 {{use function 'cabsl' instead}}<br>
-  // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:<wbr>9-[[@LINE-3]]:12}:"cabsl"<br>
-  (void)labs(x);<br>
-  // expected-warning@-1 {{using integer absolute value function 'labs' when argument is of complex type}}<br>
-  // expected-note@-2 {{use function 'cabsl' instead}}<br>
-  // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:<wbr>9-[[@LINE-3]]:13}:"cabsl"<br>
-  (void)llabs(x);<br>
-  // expected-warning@-1 {{using integer absolute value function 'llabs' when argument is of complex type}}<br>
-  // expected-note@-2 {{use function 'cabsl' instead}}<br>
-  // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:<wbr>9-[[@LINE-3]]:14}:"cabsl"<br>
-<br>
-  (void)fabsf(x);<br>
-  // expected-warning@-1 {{using floating point absolute value function 'fabsf' when argument is of complex type}}<br>
-  // expected-note@-2 {{use function 'cabsl' instead}}<br>
-  // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:<wbr>9-[[@LINE-3]]:14}:"cabsl"<br>
-  (void)fabs(x);<br>
-  // expected-warning@-1 {{using floating point absolute value function 'fabs' when argument is of complex type}}<br>
-  // expected-note@-2 {{use function 'cabsl' instead}}<br>
-  // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:<wbr>9-[[@LINE-3]]:13}:"cabsl"<br>
-  (void)fabsl(x);<br>
-  // expected-warning@-1 {{using floating point absolute value function 'fabsl' when argument is of complex type}}<br>
-  // expected-note@-2 {{use function 'cabsl' instead}}<br>
-  // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:<wbr>9-[[@LINE-3]]:14}:"cabsl"<br>
-<br>
   (void)cabsf(x);<br>
   // expected-warning@-1 {{absolute value function 'cabsf' given an argument of type '_Complex long double' but has parameter of type '_Complex float' which may cause truncation of value}}<br>
   // expected-note@-2 {{use function 'cabsl' instead}}<br>
@@ -614,32 +485,6 @@ void test_complex_long_double(_<wbr>Complex l<br>
   // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:<wbr>9-[[@LINE-3]]:13}:"cabsl"<br>
   (void)cabsl(x);<br>
<br>
-  (void)__builtin_abs(x);<br>
-  // expected-warning@-1 {{using integer absolute value function '__builtin_abs' when argument is of complex type}}<br>
-  // expected-note@-2 {{use function '__builtin_cabsl' instead}}<br>
-  // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:<wbr>9-[[@LINE-3]]:22}:"__builtin_<wbr>cabsl"<br>
-  (void)__builtin_labs(x);<br>
-  // expected-warning@-1 {{using integer absolute value function '__builtin_labs' when argument is of complex type}}<br>
-  // expected-note@-2 {{use function '__builtin_cabsl' instead}}<br>
-  // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:<wbr>9-[[@LINE-3]]:23}:"__builtin_<wbr>cabsl"<br>
-  (void)__builtin_llabs(x);<br>
-  // expected-warning@-1 {{using integer absolute value function '__builtin_llabs' when argument is of complex type}}<br>
-  // expected-note@-2 {{use function '__builtin_cabsl' instead}}<br>
-  // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:<wbr>9-[[@LINE-3]]:24}:"__builtin_<wbr>cabsl"<br>
-<br>
-  (void)__builtin_fabsf(x);<br>
-  // expected-warning@-1 {{using floating point absolute value function '__builtin_fabsf' when argument is of complex type}}<br>
-  // expected-note@-2 {{use function '__builtin_cabsl' instead}}<br>
-  // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:<wbr>9-[[@LINE-3]]:24}:"__builtin_<wbr>cabsl"<br>
-  (void)__builtin_fabs(x);<br>
-  // expected-warning@-1 {{using floating point absolute value function '__builtin_fabs' when argument is of complex type}}<br>
-  // expected-note@-2 {{use function '__builtin_cabsl' instead}}<br>
-  // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:<wbr>9-[[@LINE-3]]:23}:"__builtin_<wbr>cabsl"<br>
-  (void)__builtin_fabsl(x);<br>
-  // expected-warning@-1 {{using floating point absolute value function '__builtin_fabsl' when argument is of complex type}}<br>
-  // expected-note@-2 {{use function '__builtin_cabsl' instead}}<br>
-  // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:<wbr>9-[[@LINE-3]]:24}:"__builtin_<wbr>cabsl"<br>
-<br>
   (void)__builtin_cabsf(x);<br>
   // expected-warning@-1 {{absolute value function '__builtin_cabsf' given an argument of type '_Complex long double' but has parameter of type '_Complex float' which may cause truncation of value}}<br>
   // expected-note@-2 {{use function '__builtin_cabsl' instead}}<br>
<br>
<br>
______________________________<wbr>_________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div></div>