This implements something like the current direction of DR1581: we use a narrow syntactic check to determine the set of places where a constant expression could be evaluated, and only instantiate a constexpr function or variable if it's referenced in one of those contexts, or is odr-used. It's not yet clear whether this is the right set of syntactic locations; we currently consider all contexts within templates that would result in odr-uses after instantiation, and contexts within list-initialization (narrowing conversions take another victim...), as requiring instantiation. We could in principle restrict the former cases more (only const integral / reference variable initializers, and contexts in which a constant expression is required, perhaps). However, this is sufficient to allow us to accept libstdc++ code, which relies on GCC's behavior (which appears to be somewhat similar to this approach). llvm-svn: 291318
14 lines
494 B
C++
14 lines
494 B
C++
// RUN: %clang_cc1 -verify %s -std=c++14
|
|
|
|
template<const int I> struct S {
|
|
decltype(I) n;
|
|
int &&r = I; // expected-warning 2{{binding reference member 'r' to a temporary value}} expected-note 2{{declared here}}
|
|
};
|
|
S<5> s; // expected-note {{instantiation}}
|
|
|
|
template<typename T, T v> struct U {
|
|
decltype(v) n;
|
|
int &&r = v; // expected-warning {{binding reference member 'r' to a temporary value}} expected-note {{declared here}}
|
|
};
|
|
U<const int, 6> u; // expected-note {{instantiation}}
|