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