1570af302Sopenharmony_ci// gcc 4.9.0 introduced an invalid optimization for local weak alias symbols 2570af302Sopenharmony_ci// which drops stdout fflush from exit in musl 3570af302Sopenharmony_ci// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61144 4570af302Sopenharmony_ci#include <errno.h> 5570af302Sopenharmony_ci#include <stdio.h> 6570af302Sopenharmony_ci#include <stdlib.h> 7570af302Sopenharmony_ci#include <string.h> 8570af302Sopenharmony_ci#include <unistd.h> 9570af302Sopenharmony_ci#include <sys/wait.h> 10570af302Sopenharmony_ci#include "test.h" 11570af302Sopenharmony_ci 12570af302Sopenharmony_ci#define ASSERT(c) do { \ 13570af302Sopenharmony_ci errno = 0; \ 14570af302Sopenharmony_ci if (!(c)) \ 15570af302Sopenharmony_ci t_error("%s failed (errno: %s)\n", #c, strerror(errno)); \ 16570af302Sopenharmony_ci} while(0) 17570af302Sopenharmony_ci 18570af302Sopenharmony_ciint main(void) 19570af302Sopenharmony_ci{ 20570af302Sopenharmony_ci char tmp[] = "/data/local/tmp/testsuite-XXXXXX"; 21570af302Sopenharmony_ci int fd, pid, status; 22570af302Sopenharmony_ci char c; 23570af302Sopenharmony_ci 24570af302Sopenharmony_ci ASSERT((fd = mkstemp(tmp)) > 2); 25570af302Sopenharmony_ci ASSERT((pid = fork()) >= 0); 26570af302Sopenharmony_ci if (pid == 0) { 27570af302Sopenharmony_ci ASSERT(close(1) == 0); 28570af302Sopenharmony_ci ASSERT(dup(fd) == 1); 29570af302Sopenharmony_ci ASSERT(fwrite("x", 1, 1, stdout) == 1); 30570af302Sopenharmony_ci exit(t_status); 31570af302Sopenharmony_ci } 32570af302Sopenharmony_ci ASSERT(waitpid(pid, &status, 0) == pid); 33570af302Sopenharmony_ci ASSERT(WIFEXITED(status) && WEXITSTATUS(status) == 0); 34570af302Sopenharmony_ci ASSERT(pread(fd, &c, 1, 0) == 1); 35570af302Sopenharmony_ci ASSERT(c == 'x'); 36570af302Sopenharmony_ci ASSERT(unlink(tmp) == 0); 37570af302Sopenharmony_ci return t_status; 38570af302Sopenharmony_ci} 39