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

CheckSingleAssignmentConstraints. These no longer produce ExprError() when they have not emitted an error, and reliably inform the caller when they *have* emitted an error. This fixes some serious issues where we would fail to emit any diagnostic for invalid code and then attempt to emit code for an invalid AST, and conversely some issues where we would emit two diagnostics for the same problem. llvm-svn: 283508
73 lines
1.9 KiB
C++
73 lines
1.9 KiB
C++
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
|
|
|
namespace test0 {
|
|
struct BASE {
|
|
operator int &(); // expected-note {{candidate function}}
|
|
};
|
|
struct BASE1 {
|
|
operator int &(); // expected-note {{candidate function}}
|
|
};
|
|
|
|
struct B : public BASE, BASE1 {};
|
|
|
|
extern B f();
|
|
B b1;
|
|
|
|
void func(const int ci, const char cc); // expected-note {{candidate function}}
|
|
void func(const char ci, const B b); // expected-note {{candidate function}}
|
|
void func(const B b, const int ci); // expected-note {{candidate function}}
|
|
|
|
const int Test1() {
|
|
|
|
func(b1, f()); // expected-error {{call to 'func' is ambiguous}}
|
|
return f(); // expected-error {{conversion from 'test0::B' to 'const int' is ambiguous}}
|
|
}
|
|
|
|
// This used to crash when comparing the two operands.
|
|
void func2(const char cc); // expected-note {{candidate function}}
|
|
void func2(const int ci); // expected-note {{candidate function}}
|
|
void Test2() {
|
|
func2(b1); // expected-error {{call to 'func2' is ambiguous}}
|
|
}
|
|
}
|
|
|
|
namespace test1 {
|
|
struct E;
|
|
struct A {
|
|
A (E&);
|
|
};
|
|
|
|
struct E {
|
|
operator A ();
|
|
};
|
|
|
|
struct C {
|
|
C (E&);
|
|
};
|
|
|
|
void f1(A); // expected-note {{candidate function}}
|
|
void f1(C); // expected-note {{candidate function}}
|
|
|
|
void Test2()
|
|
{
|
|
E b;
|
|
f1(b); // expected-error {{call to 'f1' is ambiguous}}
|
|
// ambiguous because b -> C via constructor and
|
|
// b -> A via constructor or conversion function.
|
|
}
|
|
}
|
|
|
|
namespace rdar8876150 {
|
|
struct A { operator bool(); };
|
|
struct B : A { };
|
|
struct C : A { };
|
|
struct D : B, C { };
|
|
|
|
bool f(D d) { return !d; } // expected-error{{ambiguous conversion from derived class 'rdar8876150::D' to base class 'rdar8876150::A':}}
|
|
}
|
|
|
|
namespace assignment {
|
|
struct A { operator short(); operator bool(); }; // expected-note 2{{candidate}}
|
|
void f(int n, A a) { n = a; } // expected-error{{ambiguous}}
|
|
}
|