13573b2c84372d9484296fa658f5276f6c09acb92Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only -verify %s
2ccabf0868d9cb81bbc3037a8b3b400737401841dDouglas Gregortypedef int INT;
3ccabf0868d9cb81bbc3037a8b3b400737401841dDouglas Gregor
4f15ac4bc132d609f1df92308612f3d2629bbd480Douglas Gregorclass Foo {
5f15ac4bc132d609f1df92308612f3d2629bbd480Douglas Gregor  Foo();
6f15ac4bc132d609f1df92308612f3d2629bbd480Douglas Gregor  (Foo)(float) { }
71336cab43dec39c2d36531c0e3875f4db725a28cChris Lattner  explicit Foo(int); // expected-note {{previous declaration is here}}
8f15ac4bc132d609f1df92308612f3d2629bbd480Douglas Gregor  Foo(const Foo&);
9f15ac4bc132d609f1df92308612f3d2629bbd480Douglas Gregor
10ccabf0868d9cb81bbc3037a8b3b400737401841dDouglas Gregor  ((Foo))(INT); // expected-error{{cannot be redeclared}}
11ccabf0868d9cb81bbc3037a8b3b400737401841dDouglas Gregor
12869cabfb18978c6cd759b31eaa29a69ce73fd486Douglas Gregor  Foo(Foo foo, int i = 17, int j = 42); // expected-error{{copy constructor must pass its first argument by reference}}
13ccabf0868d9cb81bbc3037a8b3b400737401841dDouglas Gregor
14f15ac4bc132d609f1df92308612f3d2629bbd480Douglas Gregor  static Foo(short, short); // expected-error{{constructor cannot be declared 'static'}}
15f15ac4bc132d609f1df92308612f3d2629bbd480Douglas Gregor  virtual Foo(double); // expected-error{{constructor cannot be declared 'virtual'}}
16f15ac4bc132d609f1df92308612f3d2629bbd480Douglas Gregor  Foo(long) const; // expected-error{{'const' qualifier is not allowed on a constructor}}
17d87f5a7a7cb050e9cec8b330f06d1f034eddb417Douglas Gregor
1887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  int Foo(int, int); // expected-error{{constructor cannot have a return type}}
19c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
20c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  volatile Foo(float); // expected-error{{constructor cannot have a return type}}
21f15ac4bc132d609f1df92308612f3d2629bbd480Douglas Gregor};
2298341049a14443ad41927de25d8950936a39aeddDouglas Gregor
2398341049a14443ad41927de25d8950936a39aeddDouglas GregorFoo::Foo(const Foo&) { }
2498341049a14443ad41927de25d8950936a39aeddDouglas Gregor
25b9213832bca8e9a31450604e56a1da067fea4b7cDouglas Gregortypedef struct {
26b9213832bca8e9a31450604e56a1da067fea4b7cDouglas Gregor  int version;
27b9213832bca8e9a31450604e56a1da067fea4b7cDouglas Gregor} Anon;
28b9213832bca8e9a31450604e56a1da067fea4b7cDouglas Gregorextern const Anon anon;
29b9213832bca8e9a31450604e56a1da067fea4b7cDouglas Gregorextern "C" const Anon anon2;
30b9213832bca8e9a31450604e56a1da067fea4b7cDouglas Gregor
31303102df2c7d587d1e23126c56dc51fd0946524eSebastian Redl// PR3188: The extern declaration complained about not having an appropriate
32303102df2c7d587d1e23126c56dc51fd0946524eSebastian Redl// constructor.
33303102df2c7d587d1e23126c56dc51fd0946524eSebastian Redlstruct x;
34303102df2c7d587d1e23126c56dc51fd0946524eSebastian Redlextern x a;
35303102df2c7d587d1e23126c56dc51fd0946524eSebastian Redl
36303102df2c7d587d1e23126c56dc51fd0946524eSebastian Redl// A similar case.
37303102df2c7d587d1e23126c56dc51fd0946524eSebastian Redlstruct y {
38303102df2c7d587d1e23126c56dc51fd0946524eSebastian Redl  y(int);
39303102df2c7d587d1e23126c56dc51fd0946524eSebastian Redl};
40303102df2c7d587d1e23126c56dc51fd0946524eSebastian Redlextern y b;
4162ae25ad1ecf45a8ecfefba3b14b159a91847657Douglas Gregor
4262ae25ad1ecf45a8ecfefba3b14b159a91847657Douglas Gregorstruct Length {
4362ae25ad1ecf45a8ecfefba3b14b159a91847657Douglas Gregor  Length l() const { return *this; }
4462ae25ad1ecf45a8ecfefba3b14b159a91847657Douglas Gregor};
45c2bada747d3dfc98205776e766b2de23e68e17f5Anders Carlsson
46c2bada747d3dfc98205776e766b2de23e68e17f5Anders Carlsson// <rdar://problem/6815988>
47c2bada747d3dfc98205776e766b2de23e68e17f5Anders Carlssonstruct mmst_reg{
48c2bada747d3dfc98205776e766b2de23e68e17f5Anders Carlsson char mmst_reg[10];
49c2bada747d3dfc98205776e766b2de23e68e17f5Anders Carlsson};
50e19759d8bdf60b4aa8a56d9f0ff6b533db1ca9a3Anders Carlsson
51e19759d8bdf60b4aa8a56d9f0ff6b533db1ca9a3Anders Carlsson// PR3948
52e19759d8bdf60b4aa8a56d9f0ff6b533db1ca9a3Anders Carlssonnamespace PR3948 {
53e19759d8bdf60b4aa8a56d9f0ff6b533db1ca9a3Anders Carlsson// PR3948
54e19759d8bdf60b4aa8a56d9f0ff6b533db1ca9a3Anders Carlssonclass a {
55e19759d8bdf60b4aa8a56d9f0ff6b533db1ca9a3Anders Carlsson  public:
56e19759d8bdf60b4aa8a56d9f0ff6b533db1ca9a3Anders Carlsson  int b(int a());
57e19759d8bdf60b4aa8a56d9f0ff6b533db1ca9a3Anders Carlsson};
58e19759d8bdf60b4aa8a56d9f0ff6b533db1ca9a3Anders Carlssonint x();
59e19759d8bdf60b4aa8a56d9f0ff6b533db1ca9a3Anders Carlssonvoid y() {
60e19759d8bdf60b4aa8a56d9f0ff6b533db1ca9a3Anders Carlsson  a z; z.b(x);
61e19759d8bdf60b4aa8a56d9f0ff6b533db1ca9a3Anders Carlsson}
62e19759d8bdf60b4aa8a56d9f0ff6b533db1ca9a3Anders Carlsson}
63cb0a7f740d35c61cf51e6be64d937b6943db6c85Douglas Gregor
64cb0a7f740d35c61cf51e6be64d937b6943db6c85Douglas Gregornamespace A {
65cb0a7f740d35c61cf51e6be64d937b6943db6c85Douglas Gregor  struct S {
66cb0a7f740d35c61cf51e6be64d937b6943db6c85Douglas Gregor    S();
67cb0a7f740d35c61cf51e6be64d937b6943db6c85Douglas Gregor    S(int);
68cb0a7f740d35c61cf51e6be64d937b6943db6c85Douglas Gregor    void f1();
69cb0a7f740d35c61cf51e6be64d937b6943db6c85Douglas Gregor    void f2();
70cb0a7f740d35c61cf51e6be64d937b6943db6c85Douglas Gregor    operator int ();
71cb0a7f740d35c61cf51e6be64d937b6943db6c85Douglas Gregor    ~S();
72cb0a7f740d35c61cf51e6be64d937b6943db6c85Douglas Gregor  };
73cb0a7f740d35c61cf51e6be64d937b6943db6c85Douglas Gregor}
74cb0a7f740d35c61cf51e6be64d937b6943db6c85Douglas Gregor
75cb0a7f740d35c61cf51e6be64d937b6943db6c85Douglas GregorA::S::S() {}
76cb0a7f740d35c61cf51e6be64d937b6943db6c85Douglas Gregor
77cb0a7f740d35c61cf51e6be64d937b6943db6c85Douglas Gregorvoid A::S::f1() {}
78cb0a7f740d35c61cf51e6be64d937b6943db6c85Douglas Gregor
79cb0a7f740d35c61cf51e6be64d937b6943db6c85Douglas Gregorstruct S {};
80cb0a7f740d35c61cf51e6be64d937b6943db6c85Douglas Gregor
81cb0a7f740d35c61cf51e6be64d937b6943db6c85Douglas GregorA::S::S(int) {}
82cb0a7f740d35c61cf51e6be64d937b6943db6c85Douglas Gregor
83cb0a7f740d35c61cf51e6be64d937b6943db6c85Douglas Gregorvoid A::S::f2() {}
84cb0a7f740d35c61cf51e6be64d937b6943db6c85Douglas Gregor
85cb0a7f740d35c61cf51e6be64d937b6943db6c85Douglas GregorA::S::operator int() { return 1; }
86cb0a7f740d35c61cf51e6be64d937b6943db6c85Douglas Gregor
87cb0a7f740d35c61cf51e6be64d937b6943db6c85Douglas GregorA::S::~S() {}
88383f1936108dc776417998ac27972c6f6c3b437cDouglas Gregor
89