diff options
| author | Richard Smith <richard-llvm@metafoo.co.uk> | 2013-06-24 04:45:28 +0000 |
|---|---|---|
| committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2013-06-24 04:45:28 +0000 |
| commit | 8f8f05cf0082df92a89722c1a5ac81b95bb79313 (patch) | |
| tree | 8b7d6c5cdaa0f4b6a1fa3b40aad1f12d204df772 /clang/test/Modules | |
| parent | 02489eb4068f80d5311eb97c2309a34a1348aa77 (diff) | |
| download | bcm5719-llvm-8f8f05cf0082df92a89722c1a5ac81b95bb79313.tar.gz bcm5719-llvm-8f8f05cf0082df92a89722c1a5ac81b95bb79313.zip | |
Slightly improve cross-module merging for function templates.
llvm-svn: 184689
Diffstat (limited to 'clang/test/Modules')
| -rw-r--r-- | clang/test/Modules/Inputs/cxx-templates-a.h | 6 | ||||
| -rw-r--r-- | clang/test/Modules/Inputs/cxx-templates-b.h | 6 | ||||
| -rw-r--r-- | clang/test/Modules/Inputs/module.map | 8 | ||||
| -rw-r--r-- | clang/test/Modules/cxx-templates.cpp | 41 |
4 files changed, 61 insertions, 0 deletions
diff --git a/clang/test/Modules/Inputs/cxx-templates-a.h b/clang/test/Modules/Inputs/cxx-templates-a.h new file mode 100644 index 00000000000..52bc3a2e3ad --- /dev/null +++ b/clang/test/Modules/Inputs/cxx-templates-a.h @@ -0,0 +1,6 @@ +template<typename T> T f() { return T(); } +template<typename T> T f(T); +namespace N { + template<typename T> T f() { return T(); } + template<typename T> T f(T); +} diff --git a/clang/test/Modules/Inputs/cxx-templates-b.h b/clang/test/Modules/Inputs/cxx-templates-b.h new file mode 100644 index 00000000000..3cc940c2c40 --- /dev/null +++ b/clang/test/Modules/Inputs/cxx-templates-b.h @@ -0,0 +1,6 @@ +template<typename T> T f(); +template<typename T> T f(T t) { return t; } +namespace N { + template<typename T> T f(); + template<typename T> T f(T t) { return t; } +} diff --git a/clang/test/Modules/Inputs/module.map b/clang/test/Modules/Inputs/module.map index 65c75fdc1c6..d2ed75830b8 100644 --- a/clang/test/Modules/Inputs/module.map +++ b/clang/test/Modules/Inputs/module.map @@ -188,6 +188,14 @@ module cxx_linkage_cache { header "cxx-linkage-cache.h" } +module cxx_templates_a { + header "cxx-templates-a.h" +} + +module cxx_templates_b { + header "cxx-templates-b.h" +} + module config { header "config.h" config_macros [exhaustive] WANT_FOO, WANT_BAR diff --git a/clang/test/Modules/cxx-templates.cpp b/clang/test/Modules/cxx-templates.cpp new file mode 100644 index 00000000000..bc96772083a --- /dev/null +++ b/clang/test/Modules/cxx-templates.cpp @@ -0,0 +1,41 @@ +// RUN: rm -rf %t +// RUN: %clang_cc1 -x objective-c++ -fmodules -fmodules-cache-path=%t -I %S/Inputs %s -std=c++11 -ast-dump -ast-dump-lookups | FileCheck %s --check-prefix=CHECK-GLOBAL +// RUN: %clang_cc1 -x objective-c++ -fmodules -fmodules-cache-path=%t -I %S/Inputs %s -std=c++11 -ast-dump -ast-dump-lookups -ast-dump-filter N | FileCheck %s --check-prefix=CHECK-NAMESPACE-N +// RUN: %clang_cc1 -x objective-c++ -fmodules -fmodules-cache-path=%t -I %S/Inputs %s -verify -std=c++11 + +@import cxx_templates_a; +@import cxx_templates_b; + +void g() { + f(0); + f<double>(1.0); + f<int>(); + f(); // expected-error {{no matching function}} + // expected-note@Inputs/cxx-templates-b.h:1 {{couldn't infer template argument}} + // expected-note@Inputs/cxx-templates-b.h:2 {{requires single argument}} + + N::f(0); + N::f<double>(1.0); + N::f<int>(); + N::f(); // expected-error {{no matching function}} + // expected-note@Inputs/cxx-templates-a.h:4 {{couldn't infer template argument}} + // expected-note@Inputs/cxx-templates-a.h:5 {{requires 1 argument, but 0 were provided}} +} + +// FIXME: There should only be two 'f's here. +// CHECK-GLOBAL: DeclarationName 'f' +// CHECK-GLOBAL-NEXT: |-FunctionTemplate {{.*}} 'f' +// CHECK-GLOBAL-NEXT: |-FunctionTemplate {{.*}} 'f' +// CHECK-GLOBAL-NEXT: |-FunctionTemplate {{.*}} 'f' +// CHECK-GLOBAL-NEXT: |-FunctionTemplate {{.*}} 'f' +// CHECK-GLOBAL-NEXT: |-FunctionTemplate {{.*}} 'f' +// CHECK-GLOBAL-NEXT: |-FunctionTemplate {{.*}} 'f' +// CHECK-GLOBAL-NEXT: |-FunctionTemplate {{.*}} 'f' +// CHECK-GLOBAL-NEXT: `-FunctionTemplate {{.*}} 'f' + +// FIXME: There should only be two 'f's here. +// CHECK-NAMESPACE-N: DeclarationName 'f' +// CHECK-NAMESPACE-N-NEXT: |-FunctionTemplate {{.*}} 'f' +// CHECK-NAMESPACE-N-NEXT: |-FunctionTemplate {{.*}} 'f' +// CHECK-NAMESPACE-N-NEXT: |-FunctionTemplate {{.*}} 'f' +// CHECK-NAMESPACE-N-NEXT: `-FunctionTemplate {{.*}} 'f' |

