Tested on x86_64-pc-linux-gnu, does this look OK for trunk/backports?

-- >8 --

has_value_dependent_address for a static local variable checks type
dependence of its context, but that's too narrow and we need a more
general dependence check that considers outer template arguments as
well, so that in the testcase below we deem A<T>::g()::i to have a
value-dependent address (making f<&i>() a dependent call).

        PR c++/123529
        PR c++/98930

gcc/cp/ChangeLog:

        * pt.cc (has_value_dependent_address): Correct context
        dependence check for a static local variable.

gcc/testsuite/ChangeLog:

        * g++.dg/cpp1z/nontype9.C: New test.
---
 gcc/cp/pt.cc                          |  3 ++-
 gcc/testsuite/g++.dg/cpp1z/nontype9.C | 16 ++++++++++++++++
 2 files changed, 18 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/g++.dg/cpp1z/nontype9.C

diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc
index 60afc6b99266..d9aa3e3369c3 100644
--- a/gcc/cp/pt.cc
+++ b/gcc/cp/pt.cc
@@ -7133,7 +7133,8 @@ has_value_dependent_address (tree op)
       if (VAR_P (op)
          && TREE_STATIC (op)
          && TREE_CODE (ctx) == FUNCTION_DECL
-         && type_dependent_expression_p (ctx))
+         && DECL_TEMPLATE_INFO (ctx)
+         && any_dependent_template_arguments_p (DECL_TI_ARGS (ctx)))
        return true;
     }
 
diff --git a/gcc/testsuite/g++.dg/cpp1z/nontype9.C 
b/gcc/testsuite/g++.dg/cpp1z/nontype9.C
new file mode 100644
index 000000000000..6f4d927eff39
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1z/nontype9.C
@@ -0,0 +1,16 @@
+// PR c++/123529
+// { dg-do compile { target c++17 } }
+
+template<int* P>
+void f();
+
+template<class T>
+struct A {
+  static void g() {
+    static int i;
+    f<&i>();
+  }
+};
+
+template struct A<char>;
+template struct A<int>;
-- 
2.53.0.719.g41688c1a23

Reply via email to