// { dg-do compile } // Copyright (C) 2000 Free Software Foundation, Inc. // Contributed by Nathan Sidwell 12 Feb 2001 // More from bug 1617. The resolution of DR 214 implies that the below // call to Foo is ambiguous. // // The type transformation (on the function parameter of Foo) allowed // in the context of partial ordering of the Foo template overloads is // the following ([temp.deduct.partial]/5): // // Before the partial ordering is done, certain transformations // are performed on the types used for partial ordering: // // - If P is a reference type, P is replaced by the type // referred to. // // - If A is a reference type, A is replaced by the type // referred to. // // It follows that we are not allowed to apply array-to-pointer // decay conversion to the type of the function parameter // 'char const (&)[I]'. So the two Foo specializations should // be considered unrelated. Thus the partial ordering of the two // Foo specializations should fail. template int Foo (T const *) {return 1;} template int Foo (char const (&)[I]) {return 2;} int main () { return Foo ("a") != 2; // { dg-error "call of overloaded \[^\n\r\]* is ambiguous" } }