#define MOZ_IMPLICIT __attribute__((annotate("moz_implicit"))) struct Foo { Foo(int); // expected-error {{bad implicit conversion constructor for 'Foo'}} expected-note {{consider adding the explicit keyword to the constructor}} Foo(int, char=0); // expected-error {{bad implicit conversion constructor for 'Foo'}} expected-note {{consider adding the explicit keyword to the constructor}} Foo(...); // expected-error {{bad implicit conversion constructor for 'Foo'}} expected-note {{consider adding the explicit keyword to the constructor}} template<class T> Foo(float); // expected-error {{bad implicit conversion constructor for 'Foo'}} expected-note {{consider adding the explicit keyword to the constructor}} Foo(int, unsigned); Foo(Foo&); Foo(const Foo&); Foo(volatile Foo&); Foo(const volatile Foo&); Foo(Foo&&); Foo(const Foo&&); Foo(volatile Foo&&); Foo(const volatile Foo&&); }; struct Bar { explicit Bar(int); explicit Bar(int, char=0); explicit Bar(...); }; struct Baz { MOZ_IMPLICIT Baz(int); MOZ_IMPLICIT Baz(int, char=0); MOZ_IMPLICIT Baz(...); }; struct Barn { Barn(int) = delete; Barn(int, char=0) = delete; Barn(...) = delete; }; struct Abstract { Abstract(int); Abstract(int, char=0); Abstract(...); virtual void f() = 0; }; template<class T> struct Template { Template(int); // expected-error {{bad implicit conversion constructor for 'Template'}} expected-note {{consider adding the explicit keyword to the constructor}} template<class U> Template(float); // expected-error {{bad implicit conversion constructor for 'Template'}} expected-note {{consider adding the explicit keyword to the constructor}} };