1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only -verify %s
2b6cc91be4da4f55c7e3dca87ecfdb532b33c83caAnders Carlssontemplate<typename> struct PassRefPtr { };
3b6cc91be4da4f55c7e3dca87ecfdb532b33c83caAnders Carlssontemplate<typename T> struct RefPtr {
4b2b5cc0cf908d516a107d373db963f692449a8a8Chandler Carruth  RefPtr& operator=(const RefPtr&) { int a[sizeof(T) ? -1 : -1];} // expected-error 2 {{array with a negative size}}
5b6cc91be4da4f55c7e3dca87ecfdb532b33c83caAnders Carlsson  RefPtr& operator=(const PassRefPtr<T>&);
6b6cc91be4da4f55c7e3dca87ecfdb532b33c83caAnders Carlsson};
7b6cc91be4da4f55c7e3dca87ecfdb532b33c83caAnders Carlsson
806a9f3680d22529a2fcf20c52d71cf221d99d910Douglas Gregorstruct A { RefPtr<int> a; };  // expected-note {{instantiation of member function 'RefPtr<int>::operator=' requested here}}
906a9f3680d22529a2fcf20c52d71cf221d99d910Douglas Gregorstruct B : RefPtr<float> { }; // expected-note {{in instantiation of member function 'RefPtr<float>::operator=' requested here}}
10b6cc91be4da4f55c7e3dca87ecfdb532b33c83caAnders Carlsson
11b6cc91be4da4f55c7e3dca87ecfdb532b33c83caAnders Carlssonvoid f() {
12b6cc91be4da4f55c7e3dca87ecfdb532b33c83caAnders Carlsson  A a1, a2;
1306a9f3680d22529a2fcf20c52d71cf221d99d910Douglas Gregor  a1 = a2;
14b6cc91be4da4f55c7e3dca87ecfdb532b33c83caAnders Carlsson
15b6cc91be4da4f55c7e3dca87ecfdb532b33c83caAnders Carlsson  B b1, b2;
16c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  b1 = b2;
17b6cc91be4da4f55c7e3dca87ecfdb532b33c83caAnders Carlsson}
18