blob: 7269adccf5465992947910a52c951d8a31572d8c [file] [log] [blame]
/***************************************************************************
*
* 18.csetjmp.cpp - test exercising [support.runtime], header <csetjmp>
*
* $Id$
*
***************************************************************************
*
* 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 2007 Rogue Wave Software, Inc.
*
**************************************************************************/
#include <csetjmp>
#include <driver.h>
/**************************************************************************/
std::jmp_buf env;
void test_longjmp (int arg)
{
std::longjmp (env, arg);
rw_assert (0, 0, __LINE__,
"call to std::longjmp(..., %d) returned", arg);
}
/**************************************************************************/
static int
run_test (int, char**)
{
#ifdef longjmp
// longjmp must not be #defined as a macro
rw_assert (0, 0, __LINE__, "longjmp #defined as a macro");
#endif // longjmp
#ifdef jmp_buf
//jmp_buf must not be #defined as a macro
rw_assert (0, 0, __LINE__, "jmp_buf #defined as a macro");
#endif // jmp_buf
#ifndef setjmp
//setjmp must be #defined as a macro
rw_assert (0, 0, __LINE__, "macro setjmp not #defined");
#endif // setjmp
// verify that setjmp works
int arg = 1;
int result;
result = setjmp (env);
if (0 == result) {
test_longjmp (arg);
rw_assert (0, 0, __LINE__,
"call to std::longjmp(..., %d) returned", arg);
}
else {
rw_assert (arg == result, 0, __LINE__,
"std::longjmp(..., %d) returned %d from setjmp()",
arg, result);
// repeat a couple more times
if (arg < 3)
test_longjmp (++arg);
}
return 0;
}
/**************************************************************************/
int main (int argc, char *argv[])
{
return rw_test (argc, argv, __FILE__,
"support.runtime",
"header <csetjmp>",
run_test,
"",
(void*)0);
}