mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-24 22:08:57 -04:00

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
19 lines
775 B
C++
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);
|
|
}
|