// RUN: %clang_cc1 -std=c++11 -fsyntax-only %s -verify

namespace ExplicitConv {
  struct X { }; // expected-note 2{{candidate constructor}}

  struct Y {
    explicit operator X() const;
  };

  void test(const Y& y) {
    X x(static_cast<X>(y));
    X x2((X)y);
    X x3 = y; // expected-error{{no viable conversion from 'const ExplicitConv::Y' to 'ExplicitConv::X'}}
  }
}

namespace DR899 {
  struct C { }; // expected-note 2 {{candidate constructor}}

  struct A {
    explicit operator int() const;
    explicit operator C() const;
  };

  struct B {
    int i;
    B(const A& a): i(a) { }
  };

  int main() {
    A a;
    int i = a; // expected-error{{no viable conversion}}
    int j(a);
    C c = a; // expected-error{{no viable conversion}}
    C c2(a);
  }
}

// RUN: %clang_cc1 -std=c++11 -fsyntax-only %s -verify

namespace ExplicitConv {
  struct X { }; // expected-note 2{{candidate constructor}}

  struct Y {
    explicit operator X() const;
  };

  void test(const Y& y) {
    X x(static_cast<X>(y));
    X x2((X)y);
    X x3 = y; // expected-error{{no viable conversion from 'const ExplicitConv::Y' to 'ExplicitConv::X'}}
  }
}

--- 
+++ 
@@ -13,3 +13,25 @@
     X x3 = y; // expected-error{{no viable conversion from 'const ExplicitConv::Y' to 'ExplicitConv::X'}}
   }
 }
+
+namespace DR899 {
+  struct C { }; // expected-note 2 {{candidate constructor}}
+
+  struct A {
+    explicit operator int() const;
+    explicit operator C() const;
+  };
+
+  struct B {
+    int i;
+    B(const A& a): i(a) { }
+  };
+
+  int main() {
+    A a;
+    int i = a; // expected-error{{no viable conversion}}
+    int j(a);
+    C c = a; // expected-error{{no viable conversion}}
+    C c2(a);
+  }
+}
Add test for C++ DR899.


git-svn-id: ffe668792ed300d6c2daa1f6eba2e0aa28d7ec6c@151411 91177308-0d34-0410-b5e6-96231b3b80d8
