teak-llvm/clang/test/SemaCXX/complex-conversion.cpp
Tim Northover 0241637c0e Sema: disable implicit conversion from _Complex to real types in C++.
Converting a _Complex type to a real one simply discards the imaginary part.
This can easily lead to loss of information so for safety (and GCC
compatibility) this patch disallows that when the conversion would be implicit.

The one exception is bool, which actually compares both real and imaginary
parts and so is safe.

llvm-svn: 310427
2017-08-08 23:18:05 +00:00

19 lines
775 B
C++

// RUN: %clang_cc1 -fsyntax-only -verify %s
template<typename T> void take(T);
void func(float Real, _Complex float Complex) {
Real += Complex; // expected-error {{assigning to 'float' from incompatible type '_Complex float'}}
Real += (float)Complex;
Real = Complex; // expected-error {{implicit conversion from '_Complex float' to 'float' is not permitted in C++}}
Real = (float)Complex;
take<float>(Complex); // expected-error {{implicit conversion from '_Complex float' to 'float' is not permitted in C++}}
take<double>(1.0i); // expected-error {{implicit conversion from '_Complex double' to 'double' is not permitted in C++}}
take<_Complex float>(Complex);
// Conversion to bool doesn't actually discard the imaginary part.
take<bool>(Complex);
}