
We have a new policy in place making links to private resources something we try to avoid in source and test files. Normally, we'd organically switch to the new policy rather than make a sweeping change across a project. However, Clang is in a somewhat special circumstance currently: recently, I've had several new contributors run into rdar links around test code which their patch was changing the behavior of. This turns out to be a surprisingly bad experience, especially for newer folks, for a handful of reasons: not understanding what the link is and feeling intimidated by it, wondering whether their changes are actually breaking something important to a downstream in some way, having to hunt down strangers not involved with the patch to impose on them for help, accidental pressure from asking for potentially private IP to be made public, etc. Because folks run into these links entirely by chance (through fixing bugs or working on new features), there's not really a set of problematic links to focus on -- all of the links have basically the same potential for causing these problems. As a result, this is an omnibus patch to remove all such links. This was not a mechanical change; it was done by manually searching for rdar, radar, radr, and other variants to find all the various problematic links. From there, I tried to retain or reword the surrounding comments so that we would lose as little context as possible. However, because most links were just a plain link with no supporting context, the majority of the changes are simple removals. Differential Review: https://reviews.llvm.org/D158071
147 lines
4.9 KiB
C
147 lines
4.9 KiB
C
// REQUIRES: x86-registered-target
|
|
//
|
|
// RUN: echo "GNU89 tests:"
|
|
// RUN: %clang_cc1 %s -triple i386-unknown-unknown -Wno-strict-prototypes -O1 -disable-llvm-passes -emit-llvm -o - -std=gnu89 | FileCheck %s --check-prefix=CHECK1
|
|
// CHECK1-LABEL: define{{.*}} i32 @foo()
|
|
// CHECK1-LABEL: define{{.*}} i32 @bar()
|
|
// CHECK1-LABEL: define{{.*}} void @unreferenced1()
|
|
// CHECK1-NOT: unreferenced2
|
|
// CHECK1-LABEL: define{{.*}} void @gnu_inline()
|
|
// CHECK1-LABEL: define{{.*}} i32 @test1
|
|
// CHECK1-LABEL: define{{.*}} i32 @test2
|
|
// CHECK1-LABEL: define{{.*}} void @test3()
|
|
// CHECK1-LABEL: define available_externally i32 @test4
|
|
// CHECK1-LABEL: define available_externally i32 @test5
|
|
// CHECK1-LABEL: define{{.*}} i32 @test6
|
|
// CHECK1-LABEL: define{{.*}} void @test7
|
|
// CHECK1: define{{.*}} i{{..}} @strlcpy
|
|
// CHECK1-NOT: test9
|
|
// CHECK1-LABEL: define{{.*}} void @testA
|
|
// CHECK1-LABEL: define{{.*}} void @testB
|
|
// CHECK1-LABEL: define{{.*}} void @testC
|
|
// CHECK1-LABEL: define available_externally i32 @ei()
|
|
// CHECK1-LABEL: define available_externally void @gnu_ei_inline()
|
|
|
|
// RUN: echo "C99 tests:"
|
|
// RUN: %clang_cc1 %s -triple i386-unknown-unknown -Wno-strict-prototypes -O1 -disable-llvm-passes -emit-llvm -o - -std=gnu99 | FileCheck %s --check-prefix=CHECK2
|
|
// CHECK2-LABEL: define{{.*}} i32 @ei()
|
|
// CHECK2-LABEL: define{{.*}} i32 @bar()
|
|
// CHECK2-NOT: unreferenced1
|
|
// CHECK2-LABEL: define{{.*}} void @unreferenced2()
|
|
// CHECK2-LABEL: define{{.*}} void @gnu_inline()
|
|
// CHECK2-LABEL: define{{.*}} i32 @test1
|
|
// CHECK2-LABEL: define{{.*}} i32 @test2
|
|
// CHECK2-LABEL: define{{.*}} void @test3
|
|
// CHECK2-LABEL: define available_externally i32 @test4
|
|
// CHECK2-LABEL: define available_externally i32 @test5
|
|
// CHECK2-LABEL: define{{.*}} i32 @test6
|
|
// CHECK2-LABEL: define{{.*}} void @test7
|
|
// CHECK2: define available_externally i{{..}} @strlcpy
|
|
// CHECK2-LABEL: define{{.*}} void @test9
|
|
// CHECK2-LABEL: define{{.*}} void @testA
|
|
// CHECK2-LABEL: define{{.*}} void @testB
|
|
// CHECK2-LABEL: define{{.*}} void @testC
|
|
// CHECK2-LABEL: define available_externally i32 @foo()
|
|
// CHECK2-LABEL: define available_externally void @gnu_ei_inline()
|
|
|
|
// RUN: echo "C++ tests:"
|
|
// RUN: %clang_cc1 -x c++ %s -triple i386-unknown-unknown -O1 -disable-llvm-passes -emit-llvm -o - -std=c++98 | FileCheck %s --check-prefix=CHECK3
|
|
// CHECK3-LABEL: define{{.*}} i32 @_Z3barv()
|
|
// CHECK3-LABEL: define linkonce_odr noundef i32 @_Z3foov()
|
|
// CHECK3-NOT: unreferenced
|
|
// CHECK3-LABEL: define available_externally void @_Z10gnu_inlinev()
|
|
// CHECK3-LABEL: define available_externally void @_Z13gnu_ei_inlinev()
|
|
// CHECK3-NOT: @_Z5testCv
|
|
// CHECK3-LABEL: define linkonce_odr noundef i32 @_Z2eiv()
|
|
|
|
// RUN: echo "MS C Mode tests:"
|
|
// RUN: %clang_cc1 %s -triple i386-pc-win32 -Wno-strict-prototypes -O1 -disable-llvm-passes -emit-llvm -o - -std=c99 | FileCheck %s --check-prefix=CHECK4
|
|
// CHECK4-NOT: define weak_odr void @_Exit(
|
|
// CHECK4-LABEL: define weak_odr dso_local i32 @ei()
|
|
// CHECK4-LABEL: define dso_local i32 @bar()
|
|
// CHECK4-NOT: unreferenced1
|
|
// CHECK4-LABEL: define weak_odr dso_local void @unreferenced2()
|
|
// CHECK4-LABEL: define dso_local void @gnu_inline()
|
|
// CHECK4-LABEL: define linkonce_odr dso_local i32 @foo()
|
|
// CHECK4-LABEL: define available_externally dso_local void @gnu_ei_inline()
|
|
|
|
__attribute__((noreturn)) void __cdecl _exit(int _Code);
|
|
__inline void __cdecl _Exit(int status) { _exit(status); }
|
|
|
|
extern __inline int ei() { return 123; }
|
|
|
|
__inline int foo() {
|
|
return ei();
|
|
}
|
|
|
|
int bar() { return foo(); }
|
|
|
|
|
|
__inline void unreferenced1() {}
|
|
extern __inline void unreferenced2() {}
|
|
|
|
__inline __attribute((__gnu_inline__)) void gnu_inline() {}
|
|
void (*P1)() = gnu_inline;
|
|
|
|
// PR3988
|
|
extern __inline __attribute__((gnu_inline)) void gnu_ei_inline() {}
|
|
void (*P)() = gnu_ei_inline;
|
|
|
|
int test1();
|
|
__inline int test1() { return 4; }
|
|
__inline int test2() { return 5; }
|
|
__inline int test2();
|
|
int test2();
|
|
|
|
void test_test1() { test1(); }
|
|
void test_test2() { test2(); }
|
|
|
|
// PR3989
|
|
extern __inline void test3() __attribute__((gnu_inline));
|
|
__inline void __attribute__((gnu_inline)) test3() {}
|
|
|
|
extern int test4(void);
|
|
extern __inline __attribute__ ((__gnu_inline__)) int test4(void)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
void test_test4() { test4(); }
|
|
|
|
extern __inline int test5(void) __attribute__ ((__gnu_inline__));
|
|
extern __inline int __attribute__ ((__gnu_inline__)) test5(void)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
void test_test5() { test5(); }
|
|
|
|
// PR10233
|
|
|
|
__inline int test6() { return 0; }
|
|
extern int test6();
|
|
|
|
|
|
// No PR#, but this once crashed clang in C99 mode due to buggy extern inline
|
|
// redeclaration detection.
|
|
void test7() { }
|
|
void test7();
|
|
|
|
// PR11062; the fact that the function is named strlcpy matters here.
|
|
inline __typeof(sizeof(int)) strlcpy(char *dest, const char *src, __typeof(sizeof(int)) size) { return 3; }
|
|
void test8() { strlcpy(0,0,0); }
|
|
|
|
// PR10657; the test crashed in C99 mode
|
|
extern inline void test9() { }
|
|
void test9();
|
|
|
|
inline void testA() {}
|
|
void testA();
|
|
|
|
void testB();
|
|
inline void testB() {}
|
|
extern void testB();
|
|
|
|
extern inline void testC() {}
|
|
inline void testC();
|