; Verify that incompatible declarations of known library functions are
; not annotated with argument attributes.  This negative test complements
; annotate.ll.
;
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt < %s -passes=inferattrs -opaque-pointers -S | FileCheck %s --match-full-lines


; Exercise <math.h> function declarations.

; Expect double fabs(double).
declare float @fabs(float)
; CHECK: declare float @fabs(float)


; Exercise <stdio.h> function declarations.

; Expect int fgetc(FILE*).
declare i32 @fgetc(ptr, i32)
; CHECK: declare i32 @fgetc(ptr, i32)

; Expect char* fgets(char*, int, FILE*).
declare i32 @fgets(ptr, i32, ptr)
; CHECK: declare i32 @fgets(ptr, i32, ptr)

; Expect int sprintf(char*, const char*, ...).
declare i32 @sprintf(ptr, i64, ptr, ...)
; CHECK: declare i32 @sprintf(ptr, i64, ptr, ...)

; Expect int snprintf(char*, size_t, const char*, ...).
declare i32 @snprintf(ptr, i64, ptr)
; CHECK: declare i32 @snprintf(ptr, i64, ptr)

; Expect int sscanf(const char*, const char*, ...).
declare i32 @sscanf(ptr, ...)
; CHECK: declare i32 @sscanf(ptr, ...)


; Exercise <stdlib.h> function declarations.

; Expect int atoi(const char*).
declare i8 @atoi(ptr)
; CHECK: declare i8 @atoi(ptr)

; Expect long long atoll(const char*).
declare i1 @atoll(ptr)
; CHECK: declare i1 @atoll(ptr)

; Expect double atof(const char*).
declare float @atof(ptr)
; CHECK: declare float @atof(ptr)

; Expect double strtod(const char*, char**).
declare double @strtod(ptr, ptr, i32)
; CHECK: declare double @strtod(ptr, ptr, i32)

; Expect float strtof(const char*, char**).
declare double @strtof(ptr, ptr)
; CHECK: declare double @strtof(ptr, ptr)


; Exercise <string.h> function declarations.

; Expect void* memccpy(void*, const void*, int, size_t).
declare ptr @memccpy(ptr, ptr, i64, i64)
; CHECK: declare ptr @memccpy(ptr, ptr, i64, i64)

; Expect int strcasecmp(const char*, const char*).
declare i1 @strcasecmp(ptr, ptr)
; CHECK: declare i1 @strcasecmp(ptr, ptr)

; Expect int strcoll(const char*, const char*).
declare ptr @strcoll(ptr, ptr)
; CHECK: declare ptr @strcoll(ptr, ptr)

; Expect int strncasecmp(const char*, const char*, size_t).
declare i32 @strncasecmp(ptr, ptr, i64, i64)
; CHECK: declare i32 @strncasecmp(ptr, ptr, i64, i64)

; Expect int strxfrm(const char*, const char*).
declare i16 @strxfrm(ptr, ptr)
; CHECK: declare i16 @strxfrm(ptr, ptr)

; Expect char* strtok(const char*, const char*).
declare ptr @strtok(ptr, i8)
; CHECK: declare ptr @strtok(ptr, i8)

; Expect char* strtok_r(const char*, const char*, char**).
declare ptr @strtok_r(ptr, ptr, i64)
; CHECK: declare ptr @strtok_r(ptr, ptr, i64)

; Expect char* strdup(const char*).
declare ptr @strdup(ptr, i64)
; CHECK: declare ptr @strdup(ptr, i64)

; Expect char* strndup(const char*, size_t).
declare ptr @strndup(ptr, i64, i64)
; CHECK: declare ptr @strndup(ptr, i64, i64)


; Exercise <sys/stat.h> and <sys/statvfs.h> function declarations.

; Expect int stat(const char*, struct stat*).
declare i32 @stat(ptr, ptr, i64)
; CHECK: declare i32 @stat(ptr, ptr, i64)

; Expect int statvfs(const char*, struct statvfs*).
declare i32 @statvfs(ptr, ptr, i64)
; CHECK: declare i32 @statvfs(ptr, ptr, i64)
