1ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// RUN: %clang_cc1 -fsyntax-only -verify %s
2ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
3ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// C++ [basic.def.odr]p2:
4ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao//   An expression is potentially evaluated unless it [...] is the
5ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao//   operand of the typeid operator and the expression does not
6ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao//   designate an lvalue of polymorphic class type.
7ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
8ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// FIXME: This should really include <typeinfo>, but we don't have that yet.
9ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaonamespace std {
10ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  class type_info;
11ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}
12ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
13ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct Poly {
14ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  virtual ~Poly();
15ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
16ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
17ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct NonPoly { };
18ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
19ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T, typename Result = T>
20ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct X {
21ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  Result f(T t) { return t + t; } // expected-error{{invalid operands}}
22ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
23ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  void g(T t) {
24ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    (void)typeid(f(t)); // expected-note{{here}}
25ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  }
26ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
27ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
28ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid test(X<Poly> xp, X<Poly, Poly&> xpr, X<NonPoly> xnp, X<NonPoly, NonPoly&> xnpr) {
29ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  // These are okay (although GCC and EDG get them wrong).
30ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  xp.g(Poly());
31ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  xnp.g(NonPoly());
32ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  xnpr.g(NonPoly());
33ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
34ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  // Triggers an error (as it should);
35ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  xpr.g(Poly()); // expected-note{{instantiation of member function}}
36ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}
37