
Summary: Previously, when you did something not allowed in a host+device function and then caused it to be codegen'ed, we would print out an error telling you that you did something bad, but we wouldn't tell you how we decided that the function needed to be codegen'ed. This change causes us to print out a callstack when emitting deferred errors. This is immensely helpful when debugging highly-templated code, where it's often unclear how a function became known-emitted. We only print the callstack once per function, after we print the all deferred errors. This patch also switches all of our hashtables to using canonical FunctionDecls instead of regular FunctionDecls. This prevents a number of bugs, some of which are caught by tests added here, in which we assume that two FDs for the same function have the same pointer value. Reviewers: rnk Subscribers: cfe-commits, tra Differential Revision: https://reviews.llvm.org/D25704 llvm-svn: 284647
19 lines
701 B
Plaintext
19 lines
701 B
Plaintext
// RUN: %clang_cc1 -fcuda-is-device -fsyntax-only -verify %s
|
|
|
|
#include "Inputs/cuda.h"
|
|
|
|
// We should emit an error for hd_fn's use of a VLA. This would have been
|
|
// legal if hd_fn were never codegen'ed on the device, so we should also print
|
|
// out a callstack showing how we determine that hd_fn is known-emitted.
|
|
//
|
|
// Compare to no-call-stack-for-deferred-err.cu.
|
|
|
|
inline __host__ __device__ void hd_fn(int n);
|
|
inline __device__ void device_fn2() { hd_fn(42); } // expected-note {{called by 'device_fn2'}}
|
|
|
|
__global__ void kernel() { device_fn2(); } // expected-note {{called by 'kernel'}}
|
|
|
|
inline __host__ __device__ void hd_fn(int n) {
|
|
int vla[n]; // expected-error {{variable-length array}}
|
|
}
|