1// Test fix for PR20366
2//
3// { dg-do compile  { target *-*-aix* } }
4// { dg-options "-D_LARGE_FILES" }
5//
6// cstdio includes stdio.h and undefs most of the functions declared
7// therein, unfortunately this means that #define fopen fopen64 goes
8// away. This tests the fix, and ensures that with -D_LARGE_FILES
9// fopen et. al. are indeed aliased to the large file equivalents.
10//
11// There are many other #define foo foo64 in the AIX headers, but
12// these all work out fine as they are not undefined in libstdc++.
13// This list is probably incomplete:
14//
15// Symbol          Return type     Large file declaration.
16//
17// aio.h                      (different for different AIX versions)
18// =====
19// aio_read        int        aio_read64(int, struct aiocb64 *);
20// aio_write       int        aio_write64(int, struct aiocb64 *);
21// lio_listio      int        lio_listio64(int, struct liocb64 *[], int, void *);
22// aio_cancel      int        aio_cancel64(int, struct aiocb64 *);
23// aio_suspend     int        aio_suspend64(int, struct aiocb64 *[]);
24//
25// stdio.h
26// =======
27// fgetpos         int        fgetpos64(FILE *, fpos64_t *);
28// fopen           FILE      *fopen64(const char *, const char *);
29// freopen         FILE      *freopen64(const char *, const char *, FILE *);
30// fseeko          int        fseeko64(FILE *, off64_t, int);
31// fsetpos         int        fsetpos64(FILE *, const fpos64_t *);
32// ftello          off64_t    ftello64(FILE *);
33//
34// unistd.h
35// ========
36// fclear          off64_t    fclear64(int, off64_t);
37// fsync_range     int        fsync_range64(int, int, off64_t, off64_t);
38// ftruncate       int        ftruncate64(int, off64_t);
39// truncate        int        truncate64(const char *, off64_t);
40// lseek           off64_t    lseek64(int, off64_t, int);
41// pread           ssize_t    pread64(int, void *, size_t, off64_t);
42// pwrite          ssize_t    pwrite64(int, const void *, size_t, off64_t);
43//
44// fcntl.h
45// =======
46// open            int        open64(const char *, int, ...);
47// creat           int        creat64(const char *, mode_t);
48//
49// sys/stat.h
50// ==========
51// stat            int        stat64(const char *, struct stat64 *);
52// fstat           int        fstat64(int, struct stat64 *);
53// lstat           int        lstat64(const char *, struct stat64 *);
54//
55// stdlib.h
56// ========
57// mkstemp         int        mkstemp64(char *);
58//
59// ftw.h
60// =====
61// ftw             int        ftw64(const char *, int (*)(const char *,const struct stat64 *, int), int);
62// nftw            int        nftw64(const char *, int (*)(const char *, const struct stat64 *, int, struct FTW*), int, int);
63//
64// It seems unlikely that any of these will be used (and #undef'ed) by
65// libstdc++ in the future, if they are then this test and its
66// associated patch to fixincludes will have to be revisited.
67
68#include <cstdio>
69
70extern "C" {
71int        fgetpos(FILE *, fpos64_t *);
72FILE      *fopen(const char *, const char *);
73FILE      *freopen(const char *, const char *, FILE *);
74int        fseeko(FILE *, off64_t, int);
75int        fsetpos(FILE *, const fpos64_t *);
76off64_t    ftello(FILE *);
77}
78int main() {
79  return 0;
80}
81