// checking for implicit instantiation

/***************************************************************************
 *
 * 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"

#ifndef _RWSTD_NO_EXPLICIT_INSTANTIATION
    // establish a dependency
    // LDOPTS = EXPLICIT_INSTANTIATION.o
#endif   // _RWSTD_NO_EXPLICIT_INSTANTIATION


// int foo<int>(int) implicitly instantiated in EXPLICIT_INSTANTIATION.cpp
// via an explicit instantiation directive instantiating another template
// that references foo<int>(int)

template <class T>
T foo (T);   // declared, not defined


int main ()
{
    // test determines whether a template implicitly instantiated
    // in one translation unit via an explicit instantiation
    // directiveinstantiating another template that references
    // the former is made available to other translation units
    return foo (0);
}
