PR c++/68666 - member variable template-id
* typeck.c (finish_class_member_access_expr): Handle variable template-id. * pt.c (lookup_and_finish_template_variable): No longer static. * cp-tree.h: Declare it. From-SVN: r244599
This commit is contained in:
parent
0edd264dfc
commit
8b1346a80a
|
@ -1,3 +1,11 @@
|
||||||
|
2017-01-18 Jason Merrill <jason@redhat.com>
|
||||||
|
|
||||||
|
PR c++/68666 - member variable template-id
|
||||||
|
* typeck.c (finish_class_member_access_expr): Handle variable
|
||||||
|
template-id.
|
||||||
|
* pt.c (lookup_and_finish_template_variable): No longer static.
|
||||||
|
* cp-tree.h: Declare it.
|
||||||
|
|
||||||
2017-01-18 Nathan Sidwell <nathan@acm.org>
|
2017-01-18 Nathan Sidwell <nathan@acm.org>
|
||||||
|
|
||||||
PR c++/78488
|
PR c++/78488
|
||||||
|
|
|
@ -6449,6 +6449,7 @@ extern cp_expr perform_koenig_lookup (cp_expr, vec<tree, va_gc> *,
|
||||||
tsubst_flags_t);
|
tsubst_flags_t);
|
||||||
extern tree finish_call_expr (tree, vec<tree, va_gc> **, bool,
|
extern tree finish_call_expr (tree, vec<tree, va_gc> **, bool,
|
||||||
bool, tsubst_flags_t);
|
bool, tsubst_flags_t);
|
||||||
|
extern tree lookup_and_finish_template_variable (tree, tree, tsubst_flags_t = tf_warning_or_error);
|
||||||
extern tree finish_template_variable (tree, tsubst_flags_t = tf_warning_or_error);
|
extern tree finish_template_variable (tree, tsubst_flags_t = tf_warning_or_error);
|
||||||
extern cp_expr finish_increment_expr (cp_expr, enum tree_code);
|
extern cp_expr finish_increment_expr (cp_expr, enum tree_code);
|
||||||
extern tree finish_this_expr (void);
|
extern tree finish_this_expr (void);
|
||||||
|
|
|
@ -9035,7 +9035,7 @@ finish_template_variable (tree var, tsubst_flags_t complain)
|
||||||
/* Construct a TEMPLATE_ID_EXPR for the given variable template TEMPL having
|
/* Construct a TEMPLATE_ID_EXPR for the given variable template TEMPL having
|
||||||
TARGS template args, and instantiate it if it's not dependent. */
|
TARGS template args, and instantiate it if it's not dependent. */
|
||||||
|
|
||||||
static tree
|
tree
|
||||||
lookup_and_finish_template_variable (tree templ, tree targs,
|
lookup_and_finish_template_variable (tree templ, tree targs,
|
||||||
tsubst_flags_t complain)
|
tsubst_flags_t complain)
|
||||||
{
|
{
|
||||||
|
|
|
@ -2875,7 +2875,10 @@ finish_class_member_access_expr (cp_expr object, tree name, bool template_p,
|
||||||
tree templ = member;
|
tree templ = member;
|
||||||
|
|
||||||
if (BASELINK_P (templ))
|
if (BASELINK_P (templ))
|
||||||
templ = lookup_template_function (templ, template_args);
|
member = lookup_template_function (templ, template_args);
|
||||||
|
else if (variable_template_p (templ))
|
||||||
|
member = (lookup_and_finish_template_variable
|
||||||
|
(templ, template_args, complain));
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (complain & tf_error)
|
if (complain & tf_error)
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
// PR c++/68666
|
||||||
|
// { dg-options "-std=c++1z -fconcepts" }
|
||||||
|
|
||||||
|
struct A {
|
||||||
|
template <class>
|
||||||
|
static constexpr bool val = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
concept bool C = A::val<T>;
|
||||||
|
|
||||||
|
C{T} struct B {};
|
|
@ -0,0 +1,12 @@
|
||||||
|
// { dg-do compile { target c++14 } }
|
||||||
|
|
||||||
|
template <class T> struct A {
|
||||||
|
template <class U> static const U x = 1;
|
||||||
|
static const int y = 2;
|
||||||
|
};
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
A<int> a;
|
||||||
|
int y = a.y; // OK
|
||||||
|
int x = a.x<int>; // ???
|
||||||
|
}
|
Loading…
Reference in New Issue