Daniel Dunbar | 8fbe78f | 2009-12-15 20:14:24 +0000 | [diff] [blame] | 1 | // RUN: %clang_cc1 -fsyntax-only -verify %s |
Charles Li | 542f04c | 2015-11-11 19:34:47 +0000 | [diff] [blame] | 2 | // RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s |
| 3 | // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s |
| 4 | |
Douglas Gregor | 6f54315 | 2008-11-05 15:29:30 +0000 | [diff] [blame] | 5 | class X { |
| 6 | public: |
Douglas Gregor | 7566e4a | 2010-04-18 02:16:12 +0000 | [diff] [blame] | 7 | explicit X(const X&); // expected-note {{candidate constructor}} |
| 8 | X(int*); // expected-note 3{{candidate constructor}} |
| 9 | explicit X(float*); // expected-note {{candidate constructor}} |
Douglas Gregor | 6f54315 | 2008-11-05 15:29:30 +0000 | [diff] [blame] | 10 | }; |
| 11 | |
| 12 | class Y : public X { }; |
| 13 | |
| 14 | void f(Y y, int *ip, float *fp) { |
John McCall | 85f9055 | 2010-03-10 11:27:22 +0000 | [diff] [blame] | 15 | X x1 = y; // expected-error{{no matching constructor for initialization of 'X'}} |
Douglas Gregor | cbd0710 | 2010-11-12 03:34:06 +0000 | [diff] [blame] | 16 | X x2 = 0; |
| 17 | X x3 = ip; |
Douglas Gregor | a4b592a | 2009-12-19 03:01:41 +0000 | [diff] [blame] | 18 | X x4 = fp; // expected-error{{no viable conversion}} |
Douglas Gregor | 7566e4a | 2010-04-18 02:16:12 +0000 | [diff] [blame] | 19 | X x2a(0); // expected-error{{call to constructor of 'X' is ambiguous}} |
| 20 | X x3a(ip); |
| 21 | X x4a(fp); |
Douglas Gregor | 6f54315 | 2008-11-05 15:29:30 +0000 | [diff] [blame] | 22 | } |
Douglas Gregor | 0f3dd9a | 2009-02-19 00:52:42 +0000 | [diff] [blame] | 23 | |
| 24 | struct foo { |
Argyrios Kyrtzidis | 9813d32 | 2010-11-16 08:04:45 +0000 | [diff] [blame] | 25 | void bar(); // expected-note{{declared here}} |
Douglas Gregor | 0f3dd9a | 2009-02-19 00:52:42 +0000 | [diff] [blame] | 26 | }; |
| 27 | |
| 28 | // PR3600 |
Argyrios Kyrtzidis | 9813d32 | 2010-11-16 08:04:45 +0000 | [diff] [blame] | 29 | void test(const foo *P) { P->bar(); } // expected-error{{'bar' not viable: 'this' argument has type 'const foo', but function is not marked const}} |
Douglas Gregor | 45cf7e3 | 2010-04-02 18:24:57 +0000 | [diff] [blame] | 30 | |
| 31 | namespace PR6757 { |
| 32 | struct Foo { |
Richard Smith | 7c2bcc9 | 2016-09-07 02:14:33 +0000 | [diff] [blame] | 33 | Foo(); // expected-note{{not viable}} |
Douglas Gregor | 5ab1165 | 2010-04-17 22:01:05 +0000 | [diff] [blame] | 34 | Foo(Foo&); // expected-note{{candidate constructor not viable}} |
Douglas Gregor | 45cf7e3 | 2010-04-02 18:24:57 +0000 | [diff] [blame] | 35 | }; |
| 36 | |
| 37 | struct Bar { |
| 38 | operator const Foo&() const; |
| 39 | }; |
| 40 | |
Douglas Gregor | 5ab1165 | 2010-04-17 22:01:05 +0000 | [diff] [blame] | 41 | void f(Foo); |
Douglas Gregor | 45cf7e3 | 2010-04-02 18:24:57 +0000 | [diff] [blame] | 42 | |
Douglas Gregor | 45cf7e3 | 2010-04-02 18:24:57 +0000 | [diff] [blame] | 43 | void g(Foo foo) { |
Chris Lattner | 24b8946 | 2010-09-05 00:17:29 +0000 | [diff] [blame] | 44 | f(Bar()); // expected-error{{no viable constructor copying parameter of type 'const PR6757::Foo'}} |
Douglas Gregor | 45cf7e3 | 2010-04-02 18:24:57 +0000 | [diff] [blame] | 45 | f(foo); |
| 46 | } |
| 47 | } |
Richard Smith | b24f067 | 2012-02-11 19:22:50 +0000 | [diff] [blame] | 48 | |
| 49 | namespace DR5 { |
| 50 | // Core issue 5: if a temporary is created in copy-initialization, it is of |
| 51 | // the cv-unqualified version of the destination type. |
| 52 | namespace Ex1 { |
| 53 | struct C { }; |
| 54 | C c; |
| 55 | struct A { |
| 56 | A(const A&); |
| 57 | A(const C&); |
| 58 | }; |
| 59 | const volatile A a = c; // ok |
| 60 | } |
| 61 | |
| 62 | namespace Ex2 { |
| 63 | struct S { |
Charles Li | 542f04c | 2015-11-11 19:34:47 +0000 | [diff] [blame] | 64 | S(S&&); |
| 65 | #if __cplusplus <= 199711L // C++03 or earlier modes |
| 66 | // expected-warning@-2 {{rvalue references are a C++11 extension}} |
| 67 | #endif |
Richard Smith | b24f067 | 2012-02-11 19:22:50 +0000 | [diff] [blame] | 68 | S(int); |
| 69 | }; |
| 70 | const S a(0); |
| 71 | const S b = 0; |
| 72 | } |
| 73 | } |
Richard Smith | 7c2bcc9 | 2016-09-07 02:14:33 +0000 | [diff] [blame] | 74 | |
| 75 | struct A {}; |
| 76 | struct B : A { |
| 77 | B(); |
| 78 | B(B&); |
| 79 | B(A); |
| 80 | B(int); |
| 81 | }; |
| 82 | B b = 0; // ok, calls B(int) then A(const A&) then B(A). |