blob: 559a94a5438abab86c632ee1adda7c85a5e75d15 [file] [log] [blame]
// PR ipa/63587
// { dg-do compile { target c++11 } }
// { dg-options "-O2 -Wno-return-type" }
namespace boost {
class basic_cstring
{
public:
basic_cstring (char *);
};
template <typename> struct identity
{
};
struct make_identity;
struct function_buffer
{
};
template <typename FunctionObj> struct function_obj_invoker0
{
static int
invoke (function_buffer &)
{
FunctionObj f;
f ();
return 0;
}
};
template <typename FunctionObj> struct get_function_obj_invoker0
{
typedef function_obj_invoker0<FunctionObj> type;
};
template <typename FunctionObj> struct apply
{
typedef typename get_function_obj_invoker0<FunctionObj>::type invoker_type;
};
struct basic_vtable0
{
typedef int (*invoker_type)(function_buffer &);
template <typename F> void assign_to (F, function_buffer);
invoker_type invoker;
};
class function0
{
public:
template <typename Functor> function0 (Functor)
{
typedef typename apply<Functor>::invoker_type invoker_type;
basic_vtable0 stored_vtable { invoker_type::invoke };
stored_vtable.assign_to (0, functor);
}
function_buffer functor;
};
class function : function0
{
public:
template <typename Functor> function (Functor f) : function0 (f) {}
};
class test_unit_generator
{
};
class test_case
{
public:
test_case (basic_cstring, basic_cstring, int, function);
};
struct auto_test_unit_registrar
{
auto_test_unit_registrar (test_unit_generator);
};
template <typename F> F unwrap (F, int);
struct for_each_impl
{
template <typename Iterator, typename LastIterator, typename TransformFunc,
typename F>
static void
execute (Iterator, LastIterator, TransformFunc, F f)
{
identity<char> __trans_tmp_1;
unwrap (f, 0)(__trans_tmp_1);
}
};
template <typename, typename, typename F>
void
for_each (F f)
{
for_each_impl::execute (0, 0, 0, f);
}
template <typename TestCaseTemplate> class test_case_template_invoker
{
public:
void operator()()
{
TestCaseTemplate::run (0);
}
};
template <typename Generator, typename TestCaseTemplate>
struct generate_test_case_4_type
{
generate_test_case_4_type (basic_cstring, basic_cstring, int, Generator G)
: m_test_case_name (0), m_test_case_file (0), m_holder (G)
{
}
template <typename TestType> void operator()(identity<TestType>)
{
test_case (0, 0, 0, test_case_template_invoker<TestCaseTemplate> ());
}
basic_cstring m_test_case_name;
basic_cstring m_test_case_file;
Generator m_holder;
};
template <typename TestCaseTemplate>
class template_test_case_gen : public test_unit_generator
{
public:
template_test_case_gen (basic_cstring, basic_cstring, int)
{
for_each<int, make_identity> (
generate_test_case_4_type<template_test_case_gen, TestCaseTemplate> (
0, 0, 0, *this));
}
};
class attribute_name
{
int m_id;
public:
attribute_name (char);
};
template <typename> struct term;
namespace exprns_ {
template <typename> struct expr;
}
using exprns_::expr;
template <typename T> struct Trans_NS_proto_terminal
{
typedef expr<term<T> > type;
};
namespace exprns_ {
template <typename Arg0> struct expr<term<Arg0> >
{
Arg0 child0;
};
}
template <typename Expr> struct actor
{
typename Trans_NS_proto_terminal<Expr>::type proto_expr_;
};
template <template <typename> class Actor = actor> struct terminal
{
typedef Actor<int> type;
};
namespace log {
struct to_log_fun
{
};
class value_extractor;
template <typename, typename = value_extractor, typename = void,
template <typename> class = actor>
class attribute_actor;
class attribute_terminal
{
public:
attribute_name m_name;
attribute_name
get_name ()
{
return m_name;
}
};
template <typename, typename, typename, template <typename> class ActorT>
class attribute_actor : ActorT<attribute_terminal>
{
public:
typedef int value_type;
attribute_name
get_name ()
{
return this->proto_expr_.child0.get_name ();
}
};
template <typename AttributeValueT>
attribute_actor<AttributeValueT> attr (attribute_name); // { dg-warning "used but never defined" }
terminal<>::type stream;
template <typename LeftT, typename ImplT> class attribute_output_terminal
{
public:
template <typename U>
attribute_output_terminal (LeftT, attribute_name, ImplT, U);
};
template <typename LeftT> struct make_output_expression
{
typedef attribute_output_terminal<LeftT, to_log_fun> type;
template <typename RightT>
static type
make (LeftT left, RightT &right)
{
type (left, right.get_name (), to_log_fun (), 0);
}
};
template <typename, typename RightT, typename = typename RightT::value_type>
struct make_output_actor;
template <template <typename> class ActorT, typename LeftExprT,
typename RightT, typename ValueT>
struct make_output_actor<ActorT<LeftExprT>, RightT, ValueT>
{
typedef make_output_expression<ActorT<LeftExprT> > make_expression;
typedef ActorT<typename make_expression::type> type;
static type
make (ActorT<LeftExprT> left, RightT &right)
{
type { make_expression::make (left, right) };
}
};
template <typename LeftExprT, typename T, typename FallbackPolicyT,
typename TagT>
typename make_output_actor<actor<LeftExprT>, attribute_actor<TagT> >::type
operator<<(actor<LeftExprT> left,
attribute_actor<T, FallbackPolicyT, TagT> right)
{
make_output_actor<actor<LeftExprT>, attribute_actor<T> >::make (left, right);
}
}
}
namespace logging = boost::log;
namespace expr = logging;
namespace {
class my_class;
}
template <typename> struct default_formatting
{
void test_method ();
};
struct default_formatting_invoker
{
static void
run (void *)
{
default_formatting<int> t;
t.test_method ();
}
};
boost::auto_test_unit_registrar default_formatting_registrar56 (
boost::template_test_case_gen<default_formatting_invoker> (0, 0, 0));
template <typename CharT>
void
default_formatting<CharT>::test_method ()
{
expr::stream << expr::attr<my_class> (0);
expr::stream << expr::attr<int> (0) << expr::attr<int> (0)
<< expr::attr<int> (0);
}