diff options
Diffstat (limited to 'test')
| -rw-r--r-- | test/CodeGenCXX/lambda-expressions.cpp | 53 | ||||
| -rw-r--r-- | test/CodeGenOpenCL/pipe_types.cl | 2 | ||||
| -rw-r--r-- | test/Driver/netbsd.c | 61 | ||||
| -rw-r--r-- | test/Driver/netbsd.cpp | 100 | ||||
| -rw-r--r-- | test/Misc/diag-template-diffing-color.cpp | 22 | ||||
| -rw-r--r-- | test/Misc/diag-template-diffing.cpp | 165 | ||||
| -rw-r--r-- | test/OpenMP/cancel_codegen.cpp | 14 | ||||
| -rw-r--r-- | test/OpenMP/cancellation_point_codegen.cpp | 26 | ||||
| -rw-r--r-- | test/OpenMP/parallel_sections_codegen.cpp | 11 | ||||
| -rw-r--r-- | test/OpenMP/sections_codegen.cpp | 16 | ||||
| -rw-r--r-- | test/OpenMP/sections_firstprivate_codegen.cpp | 19 | ||||
| -rw-r--r-- | test/OpenMP/sections_lastprivate_codegen.cpp | 29 | ||||
| -rw-r--r-- | test/OpenMP/sections_private_codegen.cpp | 12 | ||||
| -rw-r--r-- | test/OpenMP/sections_reduction_codegen.cpp | 15 | ||||
| -rw-r--r-- | test/Preprocessor/predefined-arch-macros.c | 8 | ||||
| -rw-r--r-- | test/SemaObjC/ovl-check.m | 55 | 
16 files changed, 489 insertions, 119 deletions
diff --git a/test/CodeGenCXX/lambda-expressions.cpp b/test/CodeGenCXX/lambda-expressions.cpp index 2ea0561f9e92..4df44f4c5f7f 100644 --- a/test/CodeGenCXX/lambda-expressions.cpp +++ b/test/CodeGenCXX/lambda-expressions.cpp @@ -10,10 +10,23 @@ void *use = &used;  // CHECK: @cvar = global  extern "C" auto cvar = []{}; +// CHECK-LABEL: define i32 @_Z9ARBSizeOfi(i32 +int ARBSizeOf(int n) { +  typedef double (T)[8][n]; +  using TT = double [8][n]; +  return [&]() -> int { +    typedef double(T1)[8][n]; +    using TT1 = double[8][n]; +    return sizeof(T) + sizeof(T1) + sizeof(TT) + sizeof(TT1); +  }(); +} + +// CHECK-LABEL: define internal i32 @"_ZZ9ARBSizeOfiENK3$_0clEv" +  int a() { return []{ return 1; }(); }  // CHECK-LABEL: define i32 @_Z1av -// CHECK: call i32 @"_ZZ1avENK3$_0clEv" -// CHECK-LABEL: define internal i32 @"_ZZ1avENK3$_0clEv" +// CHECK: call i32 @"_ZZ1avENK3$_1clEv" +// CHECK-LABEL: define internal i32 @"_ZZ1avENK3$_1clEv"  // CHECK: ret i32 1  int b(int x) { return [x]{return x;}(); } @@ -21,8 +34,8 @@ int b(int x) { return [x]{return x;}(); }  // CHECK: store i32  // CHECK: load i32, i32*  // CHECK: store i32 -// CHECK: call i32 @"_ZZ1biENK3$_1clEv" -// CHECK-LABEL: define internal i32 @"_ZZ1biENK3$_1clEv" +// CHECK: call i32 @"_ZZ1biENK3$_2clEv" +// CHECK-LABEL: define internal i32 @"_ZZ1biENK3$_2clEv"  // CHECK: load i32, i32*  // CHECK: ret i32 @@ -30,8 +43,8 @@ int c(int x) { return [&x]{return x;}(); }  // CHECK-LABEL: define i32 @_Z1ci  // CHECK: store i32  // CHECK: store i32* -// CHECK: call i32 @"_ZZ1ciENK3$_2clEv" -// CHECK-LABEL: define internal i32 @"_ZZ1ciENK3$_2clEv" +// CHECK: call i32 @"_ZZ1ciENK3$_3clEv" +// CHECK-LABEL: define internal i32 @"_ZZ1ciENK3$_3clEv"  // CHECK: load i32*, i32**  // CHECK: load i32, i32*  // CHECK: ret i32 @@ -43,8 +56,8 @@ int d(int x) { D y[10]; [x,y] { return y[x].x; }(); }  // CHECK: call void @_ZN1DC1Ev  // CHECK: icmp ult i64 %{{.*}}, 10  // CHECK: call void @_ZN1DC1ERKS_ -// CHECK: call i32 @"_ZZ1diENK3$_3clEv" -// CHECK-LABEL: define internal i32 @"_ZZ1diENK3$_3clEv" +// CHECK: call i32 @"_ZZ1diENK3$_4clEv" +// CHECK-LABEL: define internal i32 @"_ZZ1diENK3$_4clEv"  // CHECK: load i32, i32*  // CHECK: load i32, i32*  // CHECK: ret i32 @@ -54,18 +67,18 @@ int e(E a, E b, bool cond) { [a,b,cond](){ return (cond ? a : b).x; }(); }  // CHECK-LABEL: define i32 @_Z1e1ES_b  // CHECK: call void @_ZN1EC1ERKS_  // CHECK: invoke void @_ZN1EC1ERKS_ -// CHECK: invoke i32 @"_ZZ1e1ES_bENK3$_4clEv" -// CHECK: call void @"_ZZ1e1ES_bEN3$_4D1Ev" -// CHECK: call void @"_ZZ1e1ES_bEN3$_4D1Ev" +// CHECK: invoke i32 @"_ZZ1e1ES_bENK3$_5clEv" +// CHECK: call void @"_ZZ1e1ES_bEN3$_5D1Ev" +// CHECK: call void @"_ZZ1e1ES_bEN3$_5D1Ev" -// CHECK-LABEL: define internal i32 @"_ZZ1e1ES_bENK3$_4clEv" +// CHECK-LABEL: define internal i32 @"_ZZ1e1ES_bENK3$_5clEv"  // CHECK: trunc i8  // CHECK: load i32, i32*  // CHECK: ret i32  void f() {    // CHECK-LABEL: define void @_Z1fv() -  // CHECK: @"_ZZ1fvENK3$_5cvPFiiiEEv" +  // CHECK: @"_ZZ1fvENK3$_6cvPFiiiEEv"    // CHECK-NEXT: store i32 (i32, i32)*    // CHECK-NEXT: ret void    int (*fp)(int, int) = [](int x, int y){ return x + y; }; @@ -74,7 +87,7 @@ void f() {  static int k;  int g() {    int &r = k; -  // CHECK-LABEL: define internal i32 @"_ZZ1gvENK3$_6clEv"( +  // CHECK-LABEL: define internal i32 @"_ZZ1gvENK3$_7clEv"(    // CHECK-NOT: }    // CHECK: load i32, i32* @_ZL1k,    return [] { return r; } (); @@ -91,7 +104,7 @@ void staticarrayref(){    }();  } -// CHECK-LABEL: define internal i32* @"_ZZ11PR22071_funvENK3$_8clEv" +// CHECK-LABEL: define internal i32* @"_ZZ11PR22071_funvENK3$_9clEv"  // CHECK: ret i32* @PR22071_var  int PR22071_var;  int *PR22071_fun() { @@ -99,19 +112,19 @@ int *PR22071_fun() {    return [&] { return &y; }();  } -// CHECK-LABEL: define internal void @"_ZZ1e1ES_bEN3$_4D2Ev" +// CHECK-LABEL: define internal void @"_ZZ1e1ES_bEN3$_5D2Ev" -// CHECK-LABEL: define internal i32 @"_ZZ1fvEN3$_58__invokeEii" +// CHECK-LABEL: define internal i32 @"_ZZ1fvEN3$_68__invokeEii"  // CHECK: store i32  // CHECK-NEXT: store i32  // CHECK-NEXT: load i32, i32*  // CHECK-NEXT: load i32, i32* -// CHECK-NEXT: call i32 @"_ZZ1fvENK3$_5clEii" +// CHECK-NEXT: call i32 @"_ZZ1fvENK3$_6clEii"  // CHECK-NEXT: ret i32 -// CHECK-LABEL: define internal void @"_ZZ1hvEN3$_98__invokeEv"(%struct.A* noalias sret %agg.result) {{.*}} { +// CHECK-LABEL: define internal void @"_ZZ1hvEN4$_108__invokeEv"(%struct.A* noalias sret %agg.result) {{.*}} {  // CHECK-NOT: = -// CHECK: call void @"_ZZ1hvENK3$_9clEv"(%struct.A* sret %agg.result, +// CHECK: call void @"_ZZ1hvENK4$_10clEv"(%struct.A* sret %agg.result,  // CHECK-NEXT: ret void  struct A { ~A(); };  void h() { diff --git a/test/CodeGenOpenCL/pipe_types.cl b/test/CodeGenOpenCL/pipe_types.cl index 547071cf85a3..9d8d5274a3ba 100644 --- a/test/CodeGenOpenCL/pipe_types.cl +++ b/test/CodeGenOpenCL/pipe_types.cl @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -emit-llvm -O0 -cl-std=CL2.0 -o - %s | FileCheck %s +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm -O0 -cl-std=CL2.0 -o - %s | FileCheck %s  // CHECK: %opencl.pipe_t = type opaque  typedef unsigned char __attribute__((ext_vector_type(3))) uchar3; diff --git a/test/Driver/netbsd.c b/test/Driver/netbsd.c index ffaab36390c0..351fbdf9ee9c 100644 --- a/test/Driver/netbsd.c +++ b/test/Driver/netbsd.c @@ -86,12 +86,18 @@  // RUN: %clang -no-canonical-prefixes -target arm--netbsd6.0.0-eabi -static \  // RUN: --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \  // RUN: | FileCheck -check-prefix=S-ARM-6 %s -// RUN: %clang -no-canonical-prefixes -target sparc--netbsd -static \ +// RUN: %clang -no-canonical-prefixes -target sparc--netbsd7.0.0 -static \  // RUN: --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \ -// RUN: | FileCheck -check-prefix=S-SPARC %s -// RUN: %clang -no-canonical-prefixes -target sparc64--netbsd -static \ +// RUN: | FileCheck -check-prefix=S-SPARC-7 %s +// RUN: %clang -no-canonical-prefixes -target sparc--netbsd6.0.0 -static \  // RUN: --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \ -// RUN: | FileCheck -check-prefix=S-SPARC64 %s +// RUN: | FileCheck -check-prefix=S-SPARC-6 %s +// RUN: %clang -no-canonical-prefixes -target sparc64--netbsd7.0.0 -static \ +// RUN: --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \ +// RUN: | FileCheck -check-prefix=S-SPARC64-7 %s +// RUN: %clang -no-canonical-prefixes -target sparc64--netbsd6.0.0 -static \ +// RUN: --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \ +// RUN: | FileCheck -check-prefix=S-SPARC64-6 %s  // RUN: %clang -no-canonical-prefixes -target powerpc--netbsd -static \  // RUN: --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \  // RUN: | FileCheck -check-prefix=S-POWERPC %s @@ -302,22 +308,37 @@  // S-ARM-6: "-lgcc_eh" "-lc" "-lgcc"  // S-ARM-6: "{{.*}}/usr/lib{{/|\\\\}}crtend.o" "{{.*}}/usr/lib{{/|\\\\}}crtn.o" -// S-SPARC: clang{{.*}}" "-cc1" "-triple" "sparc--netbsd" -// S-SPARC: ld{{.*}}" "--eh-frame-hdr" "-Bstatic" -// S-SPARC: "-m" "elf32_sparc" -// S-SPARC: "-o" "a.out" "{{.*}}/usr/lib{{/|\\\\}}crt0.o" -// S-SPARC: "{{.*}}/usr/lib{{/|\\\\}}sparc{{/|\\\\}}crti.o" -// S-SPARC: "{{.*}}/usr/lib{{/|\\\\}}crtbegin.o" "{{.*}}.o" "-lc" -// S-SPARC: "-lgcc_eh" "-lc" "-lgcc" -// S-SPARC: "{{.*}}/usr/lib{{/|\\\\}}crtend.o" "{{.*}}/usr/lib{{/|\\\\}}crtn.o" - -// S-SPARC64: clang{{.*}}" "-cc1" "-triple" "sparc64--netbsd" -// S-SPARC64: ld{{.*}}" "--eh-frame-hdr" "-Bstatic" -// S-SPARC64: "-m" "elf64_sparc" -// S-SPARC64: "-o" "a.out" "{{.*}}/usr/lib{{/|\\\\}}crt0.o" "{{.*}}/usr/lib{{/|\\\\}}crti.o" -// S-SPARC64: "{{.*}}/usr/lib{{/|\\\\}}crtbegin.o" "{{.*}}.o" "-lc" -// S-SPARC64: "-lgcc_eh" "-lc" "-lgcc" -// S-SPARC64: "{{.*}}/usr/lib{{/|\\\\}}crtend.o" "{{.*}}/usr/lib{{/|\\\\}}crtn.o" +// S-SPARC-6: clang{{.*}}" "-cc1" "-triple" "sparc--netbsd6.0.0" +// S-SPARC-6: ld{{.*}}" "--eh-frame-hdr" "-Bstatic" +// S-SPARC-6: "-m" "elf32_sparc" +// S-SPARC-6: "-o" "a.out" "{{.*}}/usr/lib{{/|\\\\}}crt0.o" +// S-SPARC-6: "{{.*}}/usr/lib{{/|\\\\}}sparc{{/|\\\\}}crti.o" +// S-SPARC-6: "{{.*}}/usr/lib{{/|\\\\}}crtbegin.o" "{{.*}}.o" "-lc" +// S-SPARC-6: "-lgcc_eh" "-lc" "-lgcc" +// S-SPARC-6: "{{.*}}/usr/lib{{/|\\\\}}crtend.o" "{{.*}}/usr/lib{{/|\\\\}}crtn.o" + +// S-SPARC-7: clang{{.*}}" "-cc1" "-triple" "sparc--netbsd7.0.0" +// S-SPARC-7: ld{{.*}}" "--eh-frame-hdr" "-Bstatic" +// S-SPARC-7: "-m" "elf32_sparc" +// S-SPARC-7: "-o" "a.out" "{{.*}}/usr/lib{{/|\\\\}}crt0.o" +// S-SPARC-7: "{{.*}}/usr/lib{{/|\\\\}}sparc{{/|\\\\}}crti.o" +// S-SPARC-7: "{{.*}}/usr/lib{{/|\\\\}}crtbegin.o" "{{.*}}.o" "-lc" +// S-SPARC-7: "{{.*}}/usr/lib{{/|\\\\}}crtend.o" "{{.*}}/usr/lib{{/|\\\\}}crtn.o" + +// S-SPARC64-6: clang{{.*}}" "-cc1" "-triple" "sparc64--netbsd6.0.0" +// S-SPARC64-6: ld{{.*}}" "--eh-frame-hdr" "-Bstatic" +// S-SPARC64-6: "-m" "elf64_sparc" +// S-SPARC64-6: "-o" "a.out" "{{.*}}/usr/lib{{/|\\\\}}crt0.o" "{{.*}}/usr/lib{{/|\\\\}}crti.o" +// S-SPARC64-6: "{{.*}}/usr/lib{{/|\\\\}}crtbegin.o" "{{.*}}.o" "-lc" +// S-SPARC64-6: "-lgcc_eh" "-lc" "-lgcc" +// S-SPARC64-6: "{{.*}}/usr/lib{{/|\\\\}}crtend.o" "{{.*}}/usr/lib{{/|\\\\}}crtn.o" + +// S-SPARC64-7: clang{{.*}}" "-cc1" "-triple" "sparc64--netbsd7.0.0" +// S-SPARC64-7: ld{{.*}}" "--eh-frame-hdr" "-Bstatic" +// S-SPARC64-7: "-m" "elf64_sparc" +// S-SPARC64-7: "-o" "a.out" "{{.*}}/usr/lib{{/|\\\\}}crt0.o" "{{.*}}/usr/lib{{/|\\\\}}crti.o" +// S-SPARC64-7: "{{.*}}/usr/lib{{/|\\\\}}crtbegin.o" "{{.*}}.o" "-lc" +// S-SPARC64-7: "{{.*}}/usr/lib{{/|\\\\}}crtend.o" "{{.*}}/usr/lib{{/|\\\\}}crtn.o"  // S-POWERPC: clang{{.*}}" "-cc1" "-triple" "powerpc--netbsd"  // S-POWERPC: ld{{.*}}" "--eh-frame-hdr" "-Bstatic" diff --git a/test/Driver/netbsd.cpp b/test/Driver/netbsd.cpp index e386a212de2c..856b6ccc669d 100644 --- a/test/Driver/netbsd.cpp +++ b/test/Driver/netbsd.cpp @@ -22,9 +22,21 @@  // RUN: %clangxx -no-canonical-prefixes -target sparc--netbsd \  // RUN: --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \  // RUN: | FileCheck -check-prefix=SPARC %s +// RUN: %clangxx -no-canonical-prefixes -target sparc--netbsd6.0.0 \ +// RUN: --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \ +// RUN: | FileCheck -check-prefix=SPARC-6 %s +// RUN: %clangxx -no-canonical-prefixes -target sparc--netbsd7.0.0 \ +// RUN: --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \ +// RUN: | FileCheck -check-prefix=SPARC-7 %s  // RUN: %clangxx -no-canonical-prefixes -target sparc64--netbsd \  // RUN: --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \  // RUN: | FileCheck -check-prefix=SPARC64 %s +// RUN: %clangxx -no-canonical-prefixes -target sparc64--netbsd6.0.0 \ +// RUN: --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \ +// RUN: | FileCheck -check-prefix=SPARC64-6 %s +// RUN: %clangxx -no-canonical-prefixes -target sparc64--netbsd7.0.0 \ +// RUN: --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \ +// RUN: | FileCheck -check-prefix=SPARC64-7 %s  // RUN: %clangxx -no-canonical-prefixes -target powerpc--netbsd \  // RUN: --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \  // RUN: | FileCheck -check-prefix=POWERPC %s @@ -56,9 +68,21 @@  // RUN: %clangxx -no-canonical-prefixes -target sparc--netbsd -static \  // RUN: --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \  // RUN: | FileCheck -check-prefix=S-SPARC %s +// RUN: %clangxx -no-canonical-prefixes -target sparc--netbsd6.0.0 -static \ +// RUN: --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \ +// RUN: | FileCheck -check-prefix=S-SPARC-6 %s +// RUN: %clangxx -no-canonical-prefixes -target sparc--netbsd7.0.0 -static \ +// RUN: --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \ +// RUN: | FileCheck -check-prefix=S-SPARC-7 %s  // RUN: %clangxx -no-canonical-prefixes -target sparc64--netbsd -static \  // RUN: --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \  // RUN: | FileCheck -check-prefix=S-SPARC64 %s +// RUN: %clangxx -no-canonical-prefixes -target sparc64--netbsd6.0.0 -static \ +// RUN: --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \ +// RUN: | FileCheck -check-prefix=S-SPARC64-6 %s +// RUN: %clangxx -no-canonical-prefixes -target sparc64--netbsd7.0.0 -static \ +// RUN: --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \ +// RUN: | FileCheck -check-prefix=S-SPARC64-7 %s  // RUN: %clangxx -no-canonical-prefixes -target powerpc--netbsd -static \  // RUN: --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \  // RUN: | FileCheck -check-prefix=S-POWERPC %s @@ -116,17 +140,47 @@  // SPARC: ld{{.*}}" "--eh-frame-hdr" "-dynamic-linker" "/libexec/ld.elf_so"  // SPARC: "-o" "a.out" "{{.*}}/usr/lib{{/|\\\\}}crt0.o"  // SPARC: "{{.*}}/usr/lib{{/|\\\\}}sparc{{/|\\\\}}crti.o" -// SPARC: "{{.*}}/usr/lib{{/|\\\\}}crtbegin.o" "{{.*}}.o" "-lstdc++" -// SPARC: "-lm" "-lc" "-lgcc" "--as-needed" "-lgcc_s" "--no-as-needed" +// SPARC: "{{.*}}/usr/lib{{/|\\\\}}crtbegin.o" "{{.*}}.o" "-lc++" +// SPARC: "-lm" "-lc"  // SPARC: "{{.*}}/usr/lib{{/|\\\\}}crtend.o" "{{.*}}/usr/lib{{/|\\\\}}crtn.o" +// SPARC-7: clang{{.*}}" "-cc1" "-triple" "sparc--netbsd7.0.0" +// SPARC-7: ld{{.*}}" "--eh-frame-hdr" "-dynamic-linker" "/libexec/ld.elf_so" +// SPARC-7: "-o" "a.out" "{{.*}}/usr/lib{{/|\\\\}}crt0.o" +// SPARC-7: "{{.*}}/usr/lib{{/|\\\\}}sparc{{/|\\\\}}crti.o" +// SPARC-7: "{{.*}}/usr/lib{{/|\\\\}}crtbegin.o" "{{.*}}.o" "-lc++" +// SPARC-7: "-lm" "-lc" +// SPARC-7: "{{.*}}/usr/lib{{/|\\\\}}crtend.o" "{{.*}}/usr/lib{{/|\\\\}}crtn.o" + +// SPARC-6: clang{{.*}}" "-cc1" "-triple" "sparc--netbsd6.0.0" +// SPARC-6: ld{{.*}}" "--eh-frame-hdr" "-dynamic-linker" "/libexec/ld.elf_so" +// SPARC-6: "-o" "a.out" "{{.*}}/usr/lib{{/|\\\\}}crt0.o" +// SPARC-6: "{{.*}}/usr/lib{{/|\\\\}}sparc{{/|\\\\}}crti.o" +// SPARC-6: "{{.*}}/usr/lib{{/|\\\\}}crtbegin.o" "{{.*}}.o" "-lstdc++" +// SPARC-6: "-lm" "-lc" "-lgcc" "--as-needed" "-lgcc_s" "--no-as-needed" +// SPARC-6: "{{.*}}/usr/lib{{/|\\\\}}crtend.o" "{{.*}}/usr/lib{{/|\\\\}}crtn.o" +  // SPARC64: clang{{.*}}" "-cc1" "-triple" "sparc64--netbsd"  // SPARC64: ld{{.*}}" "--eh-frame-hdr" "-dynamic-linker" "/libexec/ld.elf_so"  // SPARC64: "-o" "a.out" "{{.*}}/usr/lib{{/|\\\\}}crt0.o" "{{.*}}/usr/lib{{/|\\\\}}crti.o" -// SPARC64: "{{.*}}/usr/lib{{/|\\\\}}crtbegin.o" "{{.*}}.o" "-lstdc++" -// SPARC64: "-lm" "-lc" "-lgcc" "--as-needed" "-lgcc_s" "--no-as-needed" +// SPARC64: "{{.*}}/usr/lib{{/|\\\\}}crtbegin.o" "{{.*}}.o" "-lc++" +// SPARC64: "-lm" "-lc"  // SPARC64: "{{.*}}/usr/lib{{/|\\\\}}crtend.o" "{{.*}}/usr/lib{{/|\\\\}}crtn.o" +// SPARC64-7: clang{{.*}}" "-cc1" "-triple" "sparc64--netbsd7.0.0" +// SPARC64-7: ld{{.*}}" "--eh-frame-hdr" "-dynamic-linker" "/libexec/ld.elf_so" +// SPARC64-7: "-o" "a.out" "{{.*}}/usr/lib{{/|\\\\}}crt0.o" "{{.*}}/usr/lib{{/|\\\\}}crti.o" +// SPARC64-7: "{{.*}}/usr/lib{{/|\\\\}}crtbegin.o" "{{.*}}.o" "-lc++" +// SPARC64-7: "-lm" "-lc" +// SPARC64-7: "{{.*}}/usr/lib{{/|\\\\}}crtend.o" "{{.*}}/usr/lib{{/|\\\\}}crtn.o" + +// SPARC64-6: clang{{.*}}" "-cc1" "-triple" "sparc64--netbsd6.0.0" +// SPARC64-6: ld{{.*}}" "--eh-frame-hdr" "-dynamic-linker" "/libexec/ld.elf_so" +// SPARC64-6: "-o" "a.out" "{{.*}}/usr/lib{{/|\\\\}}crt0.o" "{{.*}}/usr/lib{{/|\\\\}}crti.o" +// SPARC64-6: "{{.*}}/usr/lib{{/|\\\\}}crtbegin.o" "{{.*}}.o" "-lstdc++" +// SPARC64-6: "-lm" "-lc" "-lgcc" "--as-needed" "-lgcc_s" "--no-as-needed" +// SPARC64-6: "{{.*}}/usr/lib{{/|\\\\}}crtend.o" "{{.*}}/usr/lib{{/|\\\\}}crtn.o" +  // POWERPC: clang{{.*}}" "-cc1" "-triple" "powerpc--netbsd"  // POWERPC: ld{{.*}}" "--eh-frame-hdr" "-dynamic-linker" "/libexec/ld.elf_so"  // POWERPC: "-o" "a.out" "{{.*}}/usr/lib{{/|\\\\}}crt0.o" @@ -191,17 +245,47 @@  // S-SPARC: ld{{.*}}" "--eh-frame-hdr" "-Bstatic"  // S-SPARC: "-o" "a.out" "{{.*}}/usr/lib{{/|\\\\}}crt0.o"  // S-SPARC: "{{.*}}/usr/lib{{/|\\\\}}sparc{{/|\\\\}}crti.o" -// S-SPARC: "{{.*}}/usr/lib{{/|\\\\}}crtbegin.o" "{{.*}}.o" "-lstdc++" -// S-SPARC: "-lm" "-lc" "-lgcc_eh" "-lc" "-lgcc" +// S-SPARC: "{{.*}}/usr/lib{{/|\\\\}}crtbegin.o" "{{.*}}.o" "-lc++" +// S-SPARC: "-lm" "-lc"  // S-SPARC: "{{.*}}/usr/lib{{/|\\\\}}crtend.o" "{{.*}}/usr/lib{{/|\\\\}}crtn.o" +// S-SPARC-7: clang{{.*}}" "-cc1" "-triple" "sparc--netbsd7.0.0" +// S-SPARC-7: ld{{.*}}" "--eh-frame-hdr" "-Bstatic" +// S-SPARC-7: "-o" "a.out" "{{.*}}/usr/lib{{/|\\\\}}crt0.o" +// S-SPARC-7: "{{.*}}/usr/lib{{/|\\\\}}sparc{{/|\\\\}}crti.o" +// S-SPARC-7: "{{.*}}/usr/lib{{/|\\\\}}crtbegin.o" "{{.*}}.o" "-lc++" +// S-SPARC-7: "-lm" "-lc" +// S-SPARC-7: "{{.*}}/usr/lib{{/|\\\\}}crtend.o" "{{.*}}/usr/lib{{/|\\\\}}crtn.o" + +// S-SPARC-6: clang{{.*}}" "-cc1" "-triple" "sparc--netbsd6.0.0" +// S-SPARC-6: ld{{.*}}" "--eh-frame-hdr" "-Bstatic" +// S-SPARC-6: "-o" "a.out" "{{.*}}/usr/lib{{/|\\\\}}crt0.o" +// S-SPARC-6: "{{.*}}/usr/lib{{/|\\\\}}sparc{{/|\\\\}}crti.o" +// S-SPARC-6: "{{.*}}/usr/lib{{/|\\\\}}crtbegin.o" "{{.*}}.o" "-lstdc++" +// S-SPARC-6: "-lm" "-lc" "-lgcc_eh" "-lc" "-lgcc" +// S-SPARC-6: "{{.*}}/usr/lib{{/|\\\\}}crtend.o" "{{.*}}/usr/lib{{/|\\\\}}crtn.o" +  // S-SPARC64: clang{{.*}}" "-cc1" "-triple" "sparc64--netbsd"  // S-SPARC64: ld{{.*}}" "--eh-frame-hdr" "-Bstatic"  // S-SPARC64: "-o" "a.out" "{{.*}}/usr/lib{{/|\\\\}}crt0.o" "{{.*}}/usr/lib{{/|\\\\}}crti.o" -// S-SPARC64: "{{.*}}/usr/lib{{/|\\\\}}crtbegin.o" "{{.*}}.o" "-lstdc++" -// S-SPARC64: "-lm" "-lc" "-lgcc_eh" "-lc" "-lgcc" +// S-SPARC64: "{{.*}}/usr/lib{{/|\\\\}}crtbegin.o" "{{.*}}.o" "-lc++" +// S-SPARC64: "-lm" "-lc"  // S-SPARC64: "{{.*}}/usr/lib{{/|\\\\}}crtend.o" "{{.*}}/usr/lib{{/|\\\\}}crtn.o" +// S-SPARC64-7: clang{{.*}}" "-cc1" "-triple" "sparc64--netbsd7.0.0" +// S-SPARC64-7: ld{{.*}}" "--eh-frame-hdr" "-Bstatic" +// S-SPARC64-7: "-o" "a.out" "{{.*}}/usr/lib{{/|\\\\}}crt0.o" "{{.*}}/usr/lib{{/|\\\\}}crti.o" +// S-SPARC64-7: "{{.*}}/usr/lib{{/|\\\\}}crtbegin.o" "{{.*}}.o" "-lc++" +// S-SPARC64-7: "-lm" "-lc" +// S-SPARC64-7: "{{.*}}/usr/lib{{/|\\\\}}crtend.o" "{{.*}}/usr/lib{{/|\\\\}}crtn.o" + +// S-SPARC64-6: clang{{.*}}" "-cc1" "-triple" "sparc64--netbsd6.0.0" +// S-SPARC64-6: ld{{.*}}" "--eh-frame-hdr" "-Bstatic" +// S-SPARC64-6: "-o" "a.out" "{{.*}}/usr/lib{{/|\\\\}}crt0.o" "{{.*}}/usr/lib{{/|\\\\}}crti.o" +// S-SPARC64-6: "{{.*}}/usr/lib{{/|\\\\}}crtbegin.o" "{{.*}}.o" "-lstdc++" +// S-SPARC64-6: "-lm" "-lc" "-lgcc_eh" "-lc" "-lgcc" +// S-SPARC64-6: "{{.*}}/usr/lib{{/|\\\\}}crtend.o" "{{.*}}/usr/lib{{/|\\\\}}crtn.o" +  // S-POWERPC: clang{{.*}}" "-cc1" "-triple" "powerpc--netbsd"  // S-POWERPC: ld{{.*}}" "--eh-frame-hdr" "-Bstatic"  // S-POWERPC: "-o" "a.out" "{{.*}}/usr/lib{{/|\\\\}}crt0.o" diff --git a/test/Misc/diag-template-diffing-color.cpp b/test/Misc/diag-template-diffing-color.cpp index e73fc2c3973a..bf203153d8d4 100644 --- a/test/Misc/diag-template-diffing-color.cpp +++ b/test/Misc/diag-template-diffing-color.cpp @@ -1,5 +1,5 @@ -// RUN: not %clang_cc1 -fsyntax-only -fcolor-diagnostics %s 2>&1 | FileCheck %s -// RUN: not %clang_cc1 -fsyntax-only -fcolor-diagnostics -fdiagnostics-show-template-tree %s 2>&1 | FileCheck %s -check-prefix=TREE +// RUN: not %clang_cc1 -fsyntax-only -std=c++11 -fcolor-diagnostics %s 2>&1 | FileCheck %s +// RUN: not %clang_cc1 -fsyntax-only -std=c++11 -fcolor-diagnostics -fdiagnostics-show-template-tree %s 2>&1 | FileCheck %s -check-prefix=TREE  // REQUIRES: ansi-escape-sequences  template<typename> struct foo {};  void func(foo<int>); @@ -82,5 +82,23 @@ namespace default_args {      // CHECK: no viable conversion from 'A<[2 * ...], (default) [[CYAN]]2[[RESET]][[BOLD]]>' to 'A<[2 * ...], [[CYAN]]0[[RESET]][[BOLD]]>'      A<0, 2, 0> N2 = M;    } +} + +namespace MixedDeclarationIntegerArgument { +  template<typename T, T n = 5> class A{}; +  int x; +  int y[5]; +  A<int> a1 = A<int&, x>(); +  // CHECK: no viable conversion from 'A<[[CYAN]]int &[[RESET]][[BOLD]], [[CYAN]]x[[RESET]][[BOLD]]>' to 'A<[[CYAN]]int[[RESET]][[BOLD]], (default) [[CYAN]]5[[RESET]][[BOLD]]>' +  // TREE: no viable conversion +  // TREE:   A< +  // TREE:     {{\[}}[[CYAN]]int &[[RESET]][[BOLD]] != [[CYAN]]int[[RESET]][[BOLD]]], +  // TREE:     {{\[}}[[CYAN]]x[[RESET]][[BOLD]] != (default) [[CYAN]]5[[RESET]][[BOLD]]]> +  A<int**, nullptr> a2 = A<int, 3 + 1>(); +  // CHECK-ELIDE-NOTREE: error: no viable conversion from 'A<[[CYAN]]int[[RESET]][[BOLD]], [[CYAN]]3 + 1[[RESET]][[BOLD]] aka [[CYAN]]4[[RESET]][[BOLD]]>' to 'A<[[CYAN]]int **[[RESET]][[BOLD]], [[CYAN]]nullptr[[RESET]][[BOLD]]>' +  // TREE: no viable conversion +  // TREE:   A< +  // TREE:     {{\[}}[[CYAN]]int[[RESET]][[BOLD]] != [[CYAN]]int **[[RESET]][[BOLD]]], +  // TREE:     {{\[}}[[CYAN]]3 + 1[[RESET]][[BOLD]] aka [[CYAN]]4[[RESET]][[BOLD]] != [[CYAN]]nullptr[[RESET]][[BOLD]]]>  } diff --git a/test/Misc/diag-template-diffing.cpp b/test/Misc/diag-template-diffing.cpp index 044f07ba06ba..70d5e7c87091 100644 --- a/test/Misc/diag-template-diffing.cpp +++ b/test/Misc/diag-template-diffing.cpp @@ -925,7 +925,7 @@ namespace DependentDefault {      // CHECK-ELIDE-NOTREE: no known conversion from 'A<char, [...]>' to 'A<int, [...]>'      a3 = a1;      // CHECK-ELIDE-NOTREE: no viable overloaded '=' -    // CHECK-ELIDE-NOTREE: no known conversion from 'A<[...], (default) 40>' to 'A<[...], 10>' +    // CHECK-ELIDE-NOTREE: no known conversion from 'A<[...], (default) Trait<T>::V aka 40>' to 'A<[...], 10>'      a2 = a3;      // CHECK-ELIDE-NOTREE: no viable overloaded '='      // CHECK-ELIDE-NOTREE: no known conversion from 'A<int, 10>' to 'A<char, 40>' @@ -1118,7 +1118,7 @@ int global, global2;  constexpr int * ptr = nullptr;  Wrapper<S<ptr>> W = MakeWrapper<S<&global>>();  // Don't print an extra '&' for 'ptr' -// CHECK-ELIDE-NOTREE: no viable conversion from 'Wrapper<S<&global>>' to 'Wrapper<S<ptr>>' +// CHECK-ELIDE-NOTREE: no viable conversion from 'Wrapper<S<&global>>' to 'Wrapper<S<ptr aka nullptr>>'  // Handle parens correctly  Wrapper<S<(&global2)>> W2 = MakeWrapper<S<&global>>(); @@ -1148,7 +1148,7 @@ S<&global, nullptr> s2 = S<&global, ptr>();  S<&global, nullptr> s3 = S<&global, &global>();  // CHECK-ELIDE-NOTREE: no viable conversion from 'S<[...], &global>' to 'S<[...], nullptr>'  S<&global, ptr> s4 = S<&global, &global>(); -// CHECK-ELIDE-NOTREE: no viable conversion from 'S<[...], &global>' to 'S<[...], ptr> +// CHECK-ELIDE-NOTREE: no viable conversion from 'S<[...], &global>' to 'S<[...], ptr aka nullptr>  Wrapper<S<&global, nullptr>> W1 = MakeWrapper<S<&global, ptr>>();  Wrapper<S<&global, static_cast<int*>(0)>> W2 = MakeWrapper<S<&global, ptr>>(); @@ -1156,7 +1156,7 @@ Wrapper<S<&global, static_cast<int*>(0)>> W2 = MakeWrapper<S<&global, ptr>>();  Wrapper<S<&global, nullptr>> W3 = MakeWrapper<S<&global, &global>>();  // CHECK-ELIDE-NOTREE: no viable conversion from 'Wrapper<S<[...], &global>>' to 'Wrapper<S<[...], nullptr>>'  Wrapper<S<&global, ptr>> W4 = MakeWrapper<S<&global, &global>>(); -// CHECK-ELIDE-NOTREE: no viable conversion from 'Wrapper<S<[...], &global>>' to 'Wrapper<S<[...], ptr>>' +// CHECK-ELIDE-NOTREE: no viable conversion from 'Wrapper<S<[...], &global>>' to 'Wrapper<S<[...], ptr aka nullptr>>'  Wrapper<S<&global2, ptr>> W5 = MakeWrapper<S<&global, nullptr>>();  // CHECK-ELIDE-NOTREE: no viable conversion from 'Wrapper<S<&global, [...]>>' to 'Wrapper<S<&global2, [...]>>' @@ -1180,7 +1180,7 @@ Wrapper<S<&global2, nullptr>> W12 =  Wrapper<S<&global, &global>> W13 = MakeWrapper<S<&global, ptr>>();  // CHECK-ELIDE-NOTREE: no viable conversion from 'Wrapper<S<[...], nullptr>>' to 'Wrapper<S<[...], &global>>'  Wrapper<S<&global, ptr>> W14 = MakeWrapper<S<&global, &global>>(); -// CHECK-ELIDE-NOTREE: no viable conversion from 'Wrapper<S<[...], &global>>' to 'Wrapper<S<[...], ptr>>' +// CHECK-ELIDE-NOTREE: no viable conversion from 'Wrapper<S<[...], &global>>' to 'Wrapper<S<[...], ptr aka nullptr>>'  }  namespace TemplateTemplateDefault { @@ -1271,7 +1271,160 @@ void test() {    foo<BoolT<true>>(X);  }  // CHECK-ELIDE-NOTREE: no matching function for call to 'foo' -// CHECK-ELIDE-NOTREE: candidate function [with T = BoolArgumentBitExtended::BoolT<true>] not viable: no known conversion from 'BoolT<0>' to 'BoolT<1>' for 1st argument +// CHECK-ELIDE-NOTREE: candidate function [with T = BoolArgumentBitExtended::BoolT<true>] not viable: no known conversion from 'BoolT<false>' to 'BoolT<true>' for 1st argument +} + +namespace DifferentIntegralTypes { +template<typename T, T n> +class A{}; +void foo() { +  A<int, 1> a1 = A<long long, 1>(); +  A<unsigned int, 1> a2 = A<int, 5>(); +  A<bool, true> a3 = A<signed char, true>(); +} +// CHECK-ELIDE-NOTREE: error: no viable conversion from 'A<long long, (long long) 1>' to 'A<int, (int) 1>' +// CHECK-ELIDE-NOTREE: error: no viable conversion from 'A<int, (int) 5>' to 'A<unsigned int, (unsigned int) 1>' +// CHECK-ELIDE-NOTREE: error: no viable conversion from 'A<signed char, (signed char) 1>' to 'A<bool, (bool) true>' +} + +namespace MixedDeclarationIntegerArgument { +template<typename T, T n> class A{}; +int x; +int y[5]; + +A<int, 5> a1 = A<int&, x>(); +A<int, 5 - 1> a2 = A<int*, &x>(); +A<int, 5 + 1> a3 = A<int*, y>(); +A<int, 0> a4 = A<int**, nullptr>(); +// CHECK-ELIDE-NOTREE: error: no viable conversion from 'A<int &, x>' to 'A<int, 5>' +// CHECK-ELIDE-NOTREE: error: no viable conversion from 'A<int *, &x>' to 'A<int, 5 - 1 aka 4>' +// CHECK-ELIDE-NOTREE: error: no viable conversion from 'A<int *, y>' to 'A<int, 5 + 1 aka 6>' +// CHECK-ELIDE-NOTREE: error: no viable conversion from 'A<int **, nullptr>' to 'A<int, 0>' +// CHECK-ELIDE-TREE: error: no viable conversion +// CHECK-ELIDE-TREE:   A< +// CHECK-ELIDE-TREE:     [int & != int], +// CHECK-ELIDE-TREE:     [x != 5]> +// CHECK-ELIDE-TREE: error: no viable conversion +// CHECK-ELIDE-TREE:   A< +// CHECK-ELIDE-TREE:     [int * != int], +// CHECK-ELIDE-TREE:     [&x != 5 - 1 aka 4]> +// CHECK-ELIDE-TREE: error: no viable conversion +// CHECK-ELIDE-TREE:   A< +// CHECK-ELIDE-TREE:     [int * != int], +// CHECK-ELIDE-TREE:     [y != 5 + 1 aka 6]> +// CHECK-ELIDE-TREE: error: no viable conversion +// CHECK-ELIDE-TREE:   A< +// CHECK-ELIDE-TREE:     [int ** != int], +// CHECK-ELIDE-TREE:     [nullptr != 0]> + +A<int&, x> a5 = A<int, 3>(); +A<int*, &x> a6 = A<int, 3 - 1>(); +A<int*, y> a7 = A<int, 3 + 1>(); +A<int**, nullptr> a8 = A<int, 3>(); +// CHECK-ELIDE-NOTREE: error: no viable conversion from 'A<int, 3>' to 'A<int &, x>' +// CHECK-ELIDE-NOTREE: error: no viable conversion from 'A<int, 3 - 1 aka 2>' to 'A<int *, &x>' +// CHECK-ELIDE-NOTREE: error: no viable conversion from 'A<int, 3 + 1 aka 4>' to 'A<int *, y>' +// CHECK-ELIDE-NOTREE: error: no viable conversion from 'A<int, 3>' to 'A<int **, nullptr>' +// CHECK-ELIDE-TREE: error: no viable conversion +// CHECK-ELIDE-TREE:   A< +// CHECK-ELIDE-TREE:     [int != int &], +// CHECK-ELIDE-TREE:     [3 != x]> +// CHECK-ELIDE-TREE: error: no viable conversion +// CHECK-ELIDE-TREE:   A< +// CHECK-ELIDE-TREE:     [int != int *], +// CHECK-ELIDE-TREE:     [3 - 1 aka 2 != &x]> +// CHECK-ELIDE-TREE: error: no viable conversion +// CHECK-ELIDE-TREE:   A< +// CHECK-ELIDE-TREE:     [int != int *], +// CHECK-ELIDE-TREE:     [3 + 1 aka 4 != y]> +// CHECK-ELIDE-TREE: error: no viable conversion +// CHECK-ELIDE-TREE:   A< +// CHECK-ELIDE-TREE:     [int != int **], +// CHECK-ELIDE-TREE:     [3 != nullptr]> + +template<class T, T n = x> class B{} ; +B<int, 5> b1 = B<int&>(); +// CHECK-ELIDE-NOTREE: error: no viable conversion from 'B<int &, (default) x>' to 'B<int, 5>' +// CHECK-ELIDE-TREE: error: no viable conversion +// CHECK-ELIDE-TREE:   B< +// CHECK-ELIDE-TREE:     [int & != int], +// CHECK-ELIDE-TREE:     [(default) x != 5]> + +B<int &> b2 = B<int, 2>(); +// CHECK-ELIDE-NOTREE: error: no viable conversion from 'B<int, 2>' to 'B<int &, (default) x>' +// CHECK-ELIDE-TREE:   B< +// CHECK-ELIDE-TREE:     [int != int &], +// CHECK-ELIDE-TREE:     [2 != (default) x]> + +template<class T, T n = 11> class C {}; +C<int> c1 = C<int&, x>(); +// CHECK-ELIDE-NOTREE: error: no viable conversion from 'C<int &, x>' to 'C<int, (default) 11>' +// CHECK-ELIDE-TREE: error: no viable conversion +// CHECK-ELIDE-TREE:   C< +// CHECK-ELIDE-TREE:     [int & != int], +// CHECK-ELIDE-TREE:     [x != (default) 11]> + +C<int &, x> c2 = C<int>(); +// CHECK-ELIDE-NOTREE: error: no viable conversion from 'C<int, (default) 11>' to 'C<int &, x>' +// CHECK-ELIDE-TREE:   C< +// CHECK-ELIDE-TREE:     [int != int &], +// CHECK-ELIDE-TREE:     [(default) 11 != x]> +} + +namespace default_args { +  template <int x, int y = 1+1, int z = 2> +  class A {}; + +  void foo(A<0> &M) { +    // CHECK-ELIDE-NOTREE: no viable conversion from 'A<[...], (default) 1 + 1 aka 2, (default) 2>' to 'A<[...], 0, 0>' +    A<0, 0, 0> N = M; + +    // CHECK-ELIDE-NOTREE: no viable conversion from 'A<[2 * ...], (default) 2>' to 'A<[2 * ...], 0>' +    A<0, 2, 0> N2 = M; +  } +} + +namespace DefaultNonTypeArgWithDependentType { +// We used to crash diffing integer template arguments when the argument type +// is dependent and default arguments were used. +template <typename SizeType = int, SizeType = 0> struct A {}; +template <typename R = A<>> R bar(); +A<> &foo() { return bar(); } +// CHECK-ELIDE-NOTREE: error: non-const lvalue reference to type 'A<[2 * ...]>' cannot bind to a temporary of type 'A<[2 * ...]>' +// CHECK-NOELIDE-NOTREE: error: non-const lvalue reference to type 'A<int, 0>' cannot bind to a temporary of type 'A<int, 0>' +} + +namespace PR24587 { +template <typename T, T v> +struct integral_constant {}; + +auto false_ = integral_constant<bool, false> {}; + +template <typename T> +void f(T, decltype(false_)); + +void run() { +  f(1, integral_constant<bool, true>{}); +} +// CHECK-ELIDE-NOTREE: error: no matching function for call to 'f' +// CHECK-ELIDE-NOTREE: note: candidate function [with T = int] not viable: no known conversion from 'integral_constant<[...], true>' to 'integral_constant<[...], false>' for 2nd argument +} + +namespace ZeroArgs { +template <int N = 0> class A {}; +template <class T = A<>> class B {}; +A<1> a1 = A<>(); +A<> a2 = A<1>(); +B<> b1 = B<int>(); +B<int> b2 = B<>(); +B<> b3 = B<const A<>>(); +B<const A<>> b4 = B<>(); +// CHECK-ELIDE-NOTREE: error: no viable conversion from 'A<(default) 0>' to 'A<1>' +// CHECK-ELIDE-NOTREE: error: no viable conversion from 'A<1>' to 'A<(default) 0>' +// CHECK-ELIDE-NOTREE: error: no viable conversion from 'B<int>' to 'B<(default) ZeroArgs::A<0>>' +// CHECK-ELIDE-NOTREE: error: no viable conversion from 'B<(default) ZeroArgs::A<0>>' to 'B<int>' +// CHECK-ELIDE-NOTREE: error: no viable conversion from 'B<const A<[...]>>' to 'B<A<[...]>>' +// CHECK-ELIDE-NOTREE: error: no viable conversion from 'B<A<[...]>>' to 'B<const A<[...]>>'  }  // CHECK-ELIDE-NOTREE: {{[0-9]*}} errors generated. diff --git a/test/OpenMP/cancel_codegen.cpp b/test/OpenMP/cancel_codegen.cpp index e2dd3673caff..8234193e8f95 100644 --- a/test/OpenMP/cancel_codegen.cpp +++ b/test/OpenMP/cancel_codegen.cpp @@ -19,9 +19,10 @@ int main (int argc, char **argv) {  {  #pragma omp cancel sections  } -// CHECK: call i32 @__kmpc_single( -// CHECK-NOT: @__kmpc_cancel -// CHECK: call void @__kmpc_end_single( +// CHECK: call void @__kmpc_for_static_init_4( +// CHECK: call i32 @__kmpc_cancel( +// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t* +// CHECK: call void @__kmpc_for_static_fini(  // CHECK: call void @__kmpc_barrier(%ident_t*  #pragma omp sections  { @@ -125,9 +126,10 @@ for (int i = 0; i < argc; ++i) {  // CHECK: ret i32 0  // CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}}) -// CHECK: call i32 @__kmpc_single( -// CHECK-NOT: @__kmpc_cancel -// CHECK: call void @__kmpc_end_single( +// CHECK: call void @__kmpc_for_static_init_4( +// CHECK: call i32 @__kmpc_cancel( +// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t* +// CHECK: call void @__kmpc_for_static_fini(  // CHECK: ret void  // CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}}) diff --git a/test/OpenMP/cancellation_point_codegen.cpp b/test/OpenMP/cancellation_point_codegen.cpp index 795f69ed24fa..91e6c6994916 100644 --- a/test/OpenMP/cancellation_point_codegen.cpp +++ b/test/OpenMP/cancellation_point_codegen.cpp @@ -22,9 +22,16 @@ int main (int argc, char **argv) {  #pragma omp cancel sections    }  } -// CHECK: call i32 @__kmpc_single( -// CHECK-NOT: @__kmpc_cancellationpoint -// CHECK: call void @__kmpc_end_single( +// CHECK: call void @__kmpc_for_static_init_4( +// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%ident_t* {{[^,]+}}, i32 [[GTID]], i32 3) +// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0 +// CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]] +// CHECK: [[EXIT]] +// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t* +// CHECK: br label +// CHECK: [[CONTINUE]] +// CHECK: br label +// CHECK: call void @__kmpc_for_static_fini(  // CHECK: call void @__kmpc_barrier(%ident_t*  #pragma omp sections  { @@ -126,9 +133,16 @@ for (int i = 0; i < argc; ++i) {  // CHECK: ret i32 0  // CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}}) -// CHECK: call i32 @__kmpc_single( -// CHECK-NOT: @__kmpc_cancellationpoint -// CHECK: call void @__kmpc_end_single( +// CHECK: call void @__kmpc_for_static_init_4( +// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%ident_t* {{[^,]+}}, i32 [[GTID:%.+]], i32 3) +// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0 +// CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]] +// CHECK: [[EXIT]] +// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t* +// CHECK: br label +// CHECK: [[CONTINUE]] +// CHECK: br label +// CHECK: call void @__kmpc_for_static_fini(  // CHECK: ret void  // CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}}) diff --git a/test/OpenMP/parallel_sections_codegen.cpp b/test/OpenMP/parallel_sections_codegen.cpp index b8c1e39d8f9e..bc7e1982dcb3 100644 --- a/test/OpenMP/parallel_sections_codegen.cpp +++ b/test/OpenMP/parallel_sections_codegen.cpp @@ -78,15 +78,10 @@ int main() {  // CHECK-LABEL: tmain  // CHECK:       call void {{.*}} @__kmpc_fork_call(  // CHECK-NOT:   __kmpc_global_thread_num -// CHECK:       [[RES:%.+]] = call i32 @__kmpc_single( -// CHECK-NEXT:  [[BOOLRES:%.+]] = icmp ne i32 [[RES]], 0 -// CHECK-NEXT:  br i1 [[BOOLRES]], label %[[THEN:.+]], label %[[END:.+]] -// CHECK:       [[THEN]] -// CHECK-NEXT:  invoke void @{{.*}}foo{{.*}}() +// CHECK:       call void @__kmpc_for_static_init_4( +// CHECK:       invoke void @{{.*}}foo{{.*}}()  // CHECK-NEXT:  unwind label %[[TERM_LPAD:.+]] -// CHECK:       call void @__kmpc_end_single( -// CHECK-NEXT:  br label %[[END]] -// CHECK:       [[END]] +// CHECK:       call void @__kmpc_for_static_fini(  // CHECK-NEXT:  ret  // CHECK:       [[TERM_LPAD]]  // CHECK:       call void @__clang_call_terminate(i8* diff --git a/test/OpenMP/sections_codegen.cpp b/test/OpenMP/sections_codegen.cpp index 44fdefeee733..291f05927d86 100644 --- a/test/OpenMP/sections_codegen.cpp +++ b/test/OpenMP/sections_codegen.cpp @@ -6,7 +6,6 @@  #ifndef HEADER  #define HEADER  // CHECK: [[IMPLICIT_BARRIER_SECTIONS_LOC:@.+]] = private unnamed_addr constant %{{.+}} { i32 0, i32 194, i32 0, i32 0, i8* -// CHECK: [[IMPLICIT_BARRIER_SINGLE_LOC:@.+]] = private unnamed_addr constant %{{.+}} { i32 0, i32 322, i32 0, i32 0, i8*  // CHECK-LABEL: foo  void foo() {};  // CHECK-LABEL: bar @@ -86,17 +85,12 @@ int main() {  // CHECK-LABEL: tmain  // CHECK:       call void {{.*}} @__kmpc_fork_call(  // CHECK-NOT:   __kmpc_global_thread_num -// CHECK:       [[RES:%.+]] = call i32 @__kmpc_single( -// CHECK-NEXT:  [[BOOLRES:%.+]] = icmp ne i32 [[RES]], 0 -// CHECK-NEXT:  br i1 [[BOOLRES]], label %[[THEN:.+]], label %[[END:.+]] -// CHECK:       [[THEN]] -// CHECK-NEXT:  invoke void @{{.*}}foo{{.*}}() +// CHECK:       call void @__kmpc_for_static_init_4( +// CHECK:       invoke void @{{.*}}foo{{.*}}()  // CHECK-NEXT:  unwind label %[[TERM_LPAD:.+]] -// CHECK:       call void @__kmpc_end_single( -// CHECK-NEXT:  br label %[[END]] -// CHECK:       [[END]] -// CHECK-NEXT:  call void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_SINGLE_LOC]], -// CHECK:  ret +// CHECK:       call void @__kmpc_for_static_fini( +// CHECK:       call void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_SECTIONS_LOC]], +// CHECK:       ret  // CHECK:       [[TERM_LPAD]]  // CHECK:       call void @__clang_call_terminate(i8*  // CHECK-NEXT:  unreachable diff --git a/test/OpenMP/sections_firstprivate_codegen.cpp b/test/OpenMP/sections_firstprivate_codegen.cpp index f673597f660b..0e9273f52ca7 100644 --- a/test/OpenMP/sections_firstprivate_codegen.cpp +++ b/test/OpenMP/sections_firstprivate_codegen.cpp @@ -202,14 +202,18 @@ int main() {  // CHECK: define {{.*}}i{{[0-9]+}} @main()  // CHECK: alloca i{{[0-9]+}}, -// CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num( +// CHECK: alloca i{{[0-9]+}}, +// CHECK: alloca i{{[0-9]+}}, +// CHECK: alloca i{{[0-9]+}}, +// CHECK: alloca i{{[0-9]+}}, +// CHECK: alloca i{{[0-9]+}},  // CHECK: [[T_VAR_PRIV:%.+]] = alloca i{{[0-9]+}},  // CHECK: [[VEC_PRIV:%.+]] = alloca [2 x i{{[0-9]+}}],  // CHECK: [[S_ARR_PRIV:%.+]] = alloca [2 x [[S_FLOAT_TY]]],  // CHECK: [[VAR_PRIV:%.+]] = alloca [[S_FLOAT_TY]],  // CHECK: [[SIVAR_PRIV:%.+]] = alloca i{{[0-9]+}}, +// CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num( -// CHECK: call i32 @__kmpc_single(  // firstprivate t_var(t_var)  // CHECK: [[T_VAR_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[T_VAR]],  // CHECK: store i{{[0-9]+}} [[T_VAR_VAL]], i{{[0-9]+}}* [[T_VAR_PRIV]], @@ -235,15 +239,16 @@ int main() {  // CHECK: call {{.*}} [[ST_TY_DESTR]]([[ST_TY]]* [[ST_TY_TEMP]])  // firstprivate isvar -// CHEC: [[SIVAR_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[SIVAR]], -// CHEC: store i{{[0-9]+}} [[SIVAR_VAL]], i{{[0-9]+}}* [[SIVAR_PRIV]], +// CHECK: [[SIVAR_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[SIVAR]], +// CHECK: store i{{[0-9]+}} [[SIVAR_VAL]], i{{[0-9]+}}* [[SIVAR_PRIV]], + +// CHECK: call void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]]) +// CHECK: call void @__kmpc_for_static_init_4( +// CHECK: call void @__kmpc_for_static_fini(  // ~(firstprivate var), ~(firstprivate s_arr)  // CHECK-DAG: call {{.*}} [[S_FLOAT_TY_DESTR]]([[S_FLOAT_TY]]* [[VAR_PRIV]])  // CHECK-DAG: call {{.*}} [[S_FLOAT_TY_DESTR]]([[S_FLOAT_TY]]* -// CHECK: call void @__kmpc_end_single( - -// CHECK: call void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])  // CHECK: = call {{.*}}i{{.+}} [[TMAIN_INT:@.+]]() diff --git a/test/OpenMP/sections_lastprivate_codegen.cpp b/test/OpenMP/sections_lastprivate_codegen.cpp index a1ff007fd61d..6ee9f63b4bdd 100644 --- a/test/OpenMP/sections_lastprivate_codegen.cpp +++ b/test/OpenMP/sections_lastprivate_codegen.cpp @@ -23,7 +23,6 @@ volatile int g = 1212;  // CHECK: [[S_FLOAT_TY:%.+]] = type { float }  // CHECK [[CAP_MAIN_TY:%.+]] = type { i{{[0-9]+}}*, [2 x i{{[0-9]+}}]*, [2 x [[S_FLOAT_TY]]]*, [[S_FLOAT_TY]]*, i{{[0-9]+}}* }  // CHECK: [[S_INT_TY:%.+]] = type { i32 } -// CHECK-DAG: [[SINGLE_BARRIER_LOC:@.+]] = private unnamed_addr constant %{{.+}} { i32 0, i32 322, i32 0, i32 0, i8*  // CHECK-DAG: [[SECTIONS_BARRIER_LOC:@.+]] = private unnamed_addr constant %{{.+}} { i32 0, i32 194, i32 0, i32 0, i8*  // CHECK-DAG: [[X:@.+]] = global double 0.0  template <typename T> @@ -234,27 +233,29 @@ int main() {  // CHECK: ret  // CHECK: define internal void [[MAIN_MICROTASK]](i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}}, -// CHECK-NOT: alloca i{{[0-9]+}}, -// CHECK-NOT: alloca [2 x i{{[0-9]+}}], -// CHECK-NOT: alloca [2 x [[S_FLOAT_TY]]], -// CHECK-NOT: alloca [[S_FLOAT_TY]], +// CHECK: alloca i{{[0-9]+}}, +// CHECK: alloca i{{[0-9]+}}, +// CHECK: alloca i{{[0-9]+}}, +// CHECK: alloca i{{[0-9]+}}, +// CHECK: alloca i{{[0-9]+}}, +// CHECK: alloca i{{[0-9]+}}, +// CHECK: alloca [2 x i{{[0-9]+}}], +// CHECK: alloca [2 x [[S_FLOAT_TY]]], +// CHECK: alloca [[S_FLOAT_TY]], +// CHECK: alloca i{{[0-9]+}},  // CHECK: store i{{[0-9]+}}* [[GTID_ADDR]], i{{[0-9]+}}** [[GTID_ADDR_REF:%.+]]  // CHECK: [[GTID_REF:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[GTID_ADDR_REF]]  // CHECK: [[GTID:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[GTID_REF]] -// CHECK: call i32 @__kmpc_single( - -// CHECK-DAG: getelementptr inbounds [2 x i32], [2 x i32]* %{{.+}}, i{{[0-9]+}} 0, i{{[0-9]+}} 0 -// CHECK-DAG: getelementptr inbounds [2 x [[S_FLOAT_TY]]], [2 x [[S_FLOAT_TY]]]* %{{.+}}, i{{[0-9]+}} 0, i{{[0-9]+}} 0 +// CHECK: call void @__kmpc_for_static_init_4(  // <Skip loop body> +// CHECK: call void @__kmpc_for_static_fini( -// CHECK-NOT: call void [[S_FLOAT_TY_DESTR]]([[S_FLOAT_TY]]* [[VAR_PRIV]]) -// CHECK-NOT: call void [[S_FLOAT_TY_DESTR]]([[S_FLOAT_TY]]* - -// CHECK: call void @__kmpc_end_single( +// CHECK-DAG: call {{.*}} [[S_FLOAT_TY_DESTR]]([[S_FLOAT_TY]]* +// CHECK-DAG: call {{.*}} [[S_FLOAT_TY_DESTR]]([[S_FLOAT_TY]]* -// CHECK: call void @__kmpc_barrier(%{{.+}}* [[SINGLE_BARRIER_LOC]], i{{[0-9]+}} [[GTID]]) +// CHECK: call void @__kmpc_barrier(  // CHECK: ret void  // diff --git a/test/OpenMP/sections_private_codegen.cpp b/test/OpenMP/sections_private_codegen.cpp index cd2218832bcf..b81265516935 100644 --- a/test/OpenMP/sections_private_codegen.cpp +++ b/test/OpenMP/sections_private_codegen.cpp @@ -157,6 +157,11 @@ int main() {  // CHECK: ret  //  // CHECK: define internal void [[MAIN_MICROTASK]](i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}}) +// CHECK: alloca i{{[0-9]+}}, +// CHECK: alloca i{{[0-9]+}}, +// CHECK: alloca i{{[0-9]+}}, +// CHECK: alloca i{{[0-9]+}}, +// CHECK: alloca i{{[0-9]+}},  // CHECK: [[T_VAR_PRIV:%.+]] = alloca i{{[0-9]+}},  // CHECK: [[VEC_PRIV:%.+]] = alloca [2 x i{{[0-9]+}}],  // CHECK: [[S_ARR_PRIV:%.+]] = alloca [2 x [[S_FLOAT_TY]]], @@ -165,7 +170,6 @@ int main() {  // CHECK: [[SIVAR_PRIV:%.+]] = alloca i{{[0-9]+}},  // CHECK-NOT: alloca [[S_FLOAT_TY]],  // CHECK: store i{{[0-9]+}}* [[GTID_ADDR]], i{{[0-9]+}}** [[GTID_ADDR_REF:%.+]] -// CHECK: call i32 @__kmpc_single(  // CHECK-NOT: [[T_VAR_PRIV]]  // CHECK-NOT: [[VEC_PRIV]]  // CHECK-NOT: [[SIVAR_PRIV]] @@ -175,9 +179,13 @@ int main() {  // CHECK-NOT: [[T_VAR_PRIV]]  // CHECK-NOT: [[VEC_PRIV]]  // CHECK: call {{.*}} [[S_FLOAT_TY_DEF_CONSTR]]([[S_FLOAT_TY]]* [[VAR_PRIV]]) + +// CHECK: call void @__kmpc_for_static_init_4( +// CHECK: call void @__kmpc_for_static_fini( +  // CHECK-DAG: call void [[S_FLOAT_TY_DESTR]]([[S_FLOAT_TY]]* [[VAR_PRIV]])  // CHECK-DAG: call void [[S_FLOAT_TY_DESTR]]([[S_FLOAT_TY]]* -// CHECK: call void @__kmpc_end_single( +// CHECK: call void @__kmpc_barrier(  // CHECK: ret void  // CHECK: define {{.*}} i{{[0-9]+}} [[TMAIN_INT]]() diff --git a/test/OpenMP/sections_reduction_codegen.cpp b/test/OpenMP/sections_reduction_codegen.cpp index f67977c39580..b52d2ee3ec37 100644 --- a/test/OpenMP/sections_reduction_codegen.cpp +++ b/test/OpenMP/sections_reduction_codegen.cpp @@ -23,7 +23,6 @@ struct S {  // CHECK-DAG: [[S_FLOAT_TY:%.+]] = type { float }  // CHECK-DAG: [[S_INT_TY:%.+]] = type { i{{[0-9]+}} }  // CHECK-DAG: [[ATOMIC_REDUCE_BARRIER_LOC:@.+]] = private unnamed_addr constant %{{.+}} { i32 0, i32 18, i32 0, i32 0, i8* -// CHECK-DAG: [[SINGLE_BARRIER_LOC:@.+]] = private unnamed_addr constant %{{.+}} { i32 0, i32 322, i32 0, i32 0, i8*  // CHECK-DAG: [[REDUCTION_LOC:@.+]] = private unnamed_addr constant %{{.+}} { i32 0, i32 18, i32 0, i32 0, i8*  // CHECK-DAG: [[REDUCTION_LOCK:@.+]] = common global [8 x i32] zeroinitializer @@ -195,23 +194,23 @@ int main() {  // CHECK: ret  //  // CHECK: define internal void [[MAIN_MICROTASK]](i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}}, -// CHECK-NOT: alloca float, -// CHECK-NOT: alloca [[S_FLOAT_TY]], -// CHECK-NOT: alloca [[S_FLOAT_TY]], -// CHECK-NOT: alloca float, +// CHECK: alloca float, +// CHECK: alloca [[S_FLOAT_TY]], +// CHECK: alloca [[S_FLOAT_TY]], +// CHECK: alloca float,  // CHECK: store i{{[0-9]+}}* [[GTID_ADDR]], i{{[0-9]+}}** [[GTID_ADDR_ADDR:%.+]],  // CHECK: [[GTID_REF:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[GTID_ADDR_ADDR]]  // CHECK: [[GTID:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[GTID_REF]] -// CHECK: call i32 @__kmpc_single(  // CHECK-NOT: call {{.*}} [[S_FLOAT_TY_DESTR]]([[S_FLOAT_TY]]* [[VAR_PRIV]])  // CHECK-NOT: call {{.*}} [[S_FLOAT_TY_DESTR]]([[S_FLOAT_TY]]* -// CHECK: call void @__kmpc_end_single( +// CHECK: call void @__kmpc_for_static_init_4( +// CHECK: call void @__kmpc_for_static_fini( -// CHECK: call void @__kmpc_barrier(%{{.+}}* [[SINGLE_BARRIER_LOC]], i{{[0-9]+}} [[GTID]]) +// CHECK: call void @__kmpc_barrier(  // CHECK: ret void diff --git a/test/Preprocessor/predefined-arch-macros.c b/test/Preprocessor/predefined-arch-macros.c index 66a96e431fc9..ea98e7fb0fe5 100644 --- a/test/Preprocessor/predefined-arch-macros.c +++ b/test/Preprocessor/predefined-arch-macros.c @@ -1787,6 +1787,10 @@  // RUN:     -target s390x-unknown-linux \  // RUN:   | FileCheck %s -check-prefix=CHECK_SYSTEMZ_Z10  // +// CHECK_SYSTEMZ_Z10: #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 +// CHECK_SYSTEMZ_Z10: #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 +// CHECK_SYSTEMZ_Z10: #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 +// CHECK_SYSTEMZ_Z10: #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8  // CHECK_SYSTEMZ_Z10: #define __LONG_DOUBLE_128__ 1  // CHECK_SYSTEMZ_Z10: #define __s390__ 1  // CHECK_SYSTEMZ_Z10: #define __s390x__ 1 @@ -1796,6 +1800,10 @@  // RUN:     -target s390x-unknown-linux \  // RUN:   | FileCheck %s -check-prefix=CHECK_SYSTEMZ_ZEC12  // +// CHECK_SYSTEMZ_ZEC12: #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 +// CHECK_SYSTEMZ_ZEC12: #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 +// CHECK_SYSTEMZ_ZEC12: #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 +// CHECK_SYSTEMZ_ZEC12: #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8  // CHECK_SYSTEMZ_ZEC12: #define __HTM__ 1  // CHECK_SYSTEMZ_ZEC12: #define __LONG_DOUBLE_128__ 1  // CHECK_SYSTEMZ_ZEC12: #define __s390__ 1 diff --git a/test/SemaObjC/ovl-check.m b/test/SemaObjC/ovl-check.m new file mode 100644 index 000000000000..7fc8a6404911 --- /dev/null +++ b/test/SemaObjC/ovl-check.m @@ -0,0 +1,55 @@ +// RUN: %clang_cc1 -triple x86_64-apple-darwin11 -fsyntax-only -verify %s -fobjc-arc +// +// These tests exist as a means to help ensure that diagnostics aren't printed +// in overload resolution in ObjC. + +struct Type1 { int a; }; +@interface Iface1 @end + +@interface NeverCalled +- (void) test:(struct Type1 *)arg; +@end + +@interface TakesIface1 +- (void) test:(Iface1 *)arg; +@end + +// PR26085, rdar://problem/24111333 +void testTakesIface1(id x, Iface1 *arg) { +  // This should resolve silently to `TakesIface1`. +  [x test:arg]; +} + +@class NSString; +@interface NeverCalledv2 +- (void) testStr:(NSString *)arg; +@end + +@interface TakesVanillaConstChar +- (void) testStr:(const void *)a; +@end + +// Not called out explicitly by PR26085, but related. +void testTakesNSString(id x) { +  // Overload resolution should not emit a diagnostic about needing to add an +  // '@' before "someStringLiteral". +  [x testStr:"someStringLiteral"]; +} + +typedef const void *CFTypeRef; +id CreateSomething(); + +@interface NeverCalledv3 +- (void) testCFTypeRef:(struct Type1 *)arg; +@end + +@interface TakesCFTypeRef +- (void) testCFTypeRef:(CFTypeRef)arg; +@end + +// Not called out explicitly by PR26085, but related. +void testTakesCFTypeRef(id x) { +  // Overload resolution should occur silently, select the CFTypeRef overload, +  // and produce a single complaint. (with notes) +  [x testCFTypeRef:CreateSomething()]; // expected-error{{implicit conversion of Objective-C pointer type 'id' to C pointer type 'CFTypeRef'}} expected-note{{use __bridge}} expected-note{{use __bridge_retained}} +}  | 
