2016-10-20 05:03:38 +08:00
|
|
|
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
|
|
|
|
|
|
|
// The hd function template is instantiated three times.
|
|
|
|
//
|
|
|
|
// Two of those instantiations call a device function, which is an error when
|
|
|
|
// compiling for host. Clang should report both errors.
|
|
|
|
|
|
|
|
#include "Inputs/cuda.h"
|
|
|
|
|
|
|
|
template <typename T>
|
|
|
|
struct Selector {};
|
|
|
|
|
|
|
|
template <>
|
|
|
|
struct Selector<int> {
|
|
|
|
__host__ void f() {}
|
|
|
|
};
|
|
|
|
|
|
|
|
template <>
|
|
|
|
struct Selector<float> {
|
|
|
|
__device__ void f() {} // expected-note {{declared here}}
|
|
|
|
};
|
|
|
|
|
|
|
|
template <>
|
|
|
|
struct Selector<double> {
|
|
|
|
__device__ void f() {} // expected-note {{declared here}}
|
|
|
|
};
|
|
|
|
|
|
|
|
template <typename T>
|
|
|
|
inline __host__ __device__ void hd() {
|
|
|
|
Selector<T>().f();
|
2016-10-22 04:50:47 +08:00
|
|
|
// expected-error@-1 2 {{reference to __device__ function}}
|
2016-10-20 05:03:38 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
void host_fn() {
|
|
|
|
hd<int>();
|
|
|
|
hd<double>(); // expected-note {{function template specialization 'hd<double>'}}
|
2016-10-20 05:15:01 +08:00
|
|
|
// expected-note@-1 {{called by 'host_fn'}}
|
2016-10-20 05:03:38 +08:00
|
|
|
hd<float>(); // expected-note {{function template specialization 'hd<float>'}}
|
2016-10-20 05:15:01 +08:00
|
|
|
// expected-note@-1 {{called by 'host_fn'}}
|
2016-10-20 05:03:38 +08:00
|
|
|
}
|