// checking if default args are instantiated

/***************************************************************************
 *
 * Licensed to the Apache Software  Foundation (ASF) under one or more
 * contributor  license agreements.  See  the NOTICE  file distributed
 * with  this  work  for  additional information  regarding  copyright
 * ownership.   The ASF  licenses this  file to  you under  the Apache
 * License, Version  2.0 (the  License); you may  not use  this file
 * except in  compliance with the License.   You may obtain  a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the  License is distributed on an  "AS IS" BASIS,
 * WITHOUT  WARRANTIES OR CONDITIONS  OF ANY  KIND, either  express or
 * implied.   See  the License  for  the  specific language  governing
 * permissions and limitations under the License.
 *
 * Copyright 1999-2007 Rogue Wave Software, Inc.
 * 
 **************************************************************************/

#include "config.h"


template <class T>
struct A
{
    // must be able to use inaccessible members
    void foo (const T& = T ()) { }

    // must be able to use non-existent members
    void bar (const T& = T::foobar ());
};

template <class T>
void A<T>::bar (const T& /* = T::foobar () */) { }

struct B
{
    // no foobar() declared
private:
    B () { }
};

#ifndef _RWSTD_NO_EXPLICIT_INSTANTIATION
// 14.7.2, p9 - an explicit instantiation does not constitute
//              a use of a default argument
template class A<B>;

#else   // if defined (_RWSTD_NO_EXPLICIT_INSTANTIATION)

void foo ()
{
    &A<int>::foo;
}

#endif   // _RWSTD_NO_EXPLICIT_INSTANTIATION
