// checking for empty mem-initializer arglist

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

template <class T, class U>
struct S
{
    T t;
    U u;

    // exercise 12.6.2, p3, bullet 1
    S (): t (/* expression-list optional */), u () { }
};

int foo (char c)
{
    // dirty up the stack
    char dummy [32];
    for (int i = 0; i != sizeof dummy; ++i)
        dummy [i] = c + i;

    return dummy [0] + dummy [sizeof dummy - 1];
}

struct X
{
    char c;
    int  i;
};

int bar ()
{
    S<int, X> s;
    const char *p = (const char*)&s;

    // member must be default-initialized (zeroed out)
    for (int i = 0; i != sizeof s; ++i)
        if (*p)
            return 0;
    return 1;
}

int main ()
{
    foo ('a');

    return !bar ();
}
