PR c++/89537 - missing location for error with non-static member fn.
authorMarek Polacek <polacek@redhat.com>
Fri, 1 Mar 2019 15:57:46 +0000 (15:57 +0000)
committerMarek Polacek <mpolacek@gcc.gnu.org>
Fri, 1 Mar 2019 15:57:46 +0000 (15:57 +0000)
* call.c (resolve_args): Use EXPR_LOCATION.
* typeck.c (build_class_member_access_expr): Use input_location.

* g++.dg/diagnostic/member-fn-1.C: New test.

From-SVN: r269318

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/cp/typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/diagnostic/member-fn-1.C [new file with mode: 0644]

index ae5fd563dc30382bee0330079f527be18f817e39..bc6754ec819e4317ce14d60b09f0609fb59fabd6 100644 (file)
@@ -1,5 +1,9 @@
 2019-03-01  Marek Polacek  <polacek@redhat.com>
 
+       PR c++/89537 - missing location for error with non-static member fn.
+       * call.c (resolve_args): Use EXPR_LOCATION.
+       * typeck.c (build_class_member_access_expr): Use input_location.
+
        PR c++/89532 - ICE with incomplete type in decltype.
        * semantics.c (finish_compound_literal): Return error_mark_node
        if digest_init_flags returns error_mark_node.
index fb67d905acdfcda0a1f5f0474035a51b2b714f29..d9073d7c23dc737350461cca5105e21a83951aac 100644 (file)
@@ -4246,7 +4246,7 @@ resolve_args (vec<tree, va_gc> *args, tsubst_flags_t complain)
            error ("invalid use of void expression");
          return NULL;
        }
-      else if (invalid_nonstatic_memfn_p (arg->exp.locus, arg, complain))
+      else if (invalid_nonstatic_memfn_p (EXPR_LOCATION (arg), arg, complain))
        return NULL;
     }
   return args;
index 1db9333b5ff437601395f1e9296b880fb9af1ba3..1bf9ad88141b6c6a7970a4d0472f2e489e68d3d4 100644 (file)
@@ -2562,7 +2562,8 @@ build_class_member_access_expr (cp_expr object, tree member,
        type = unknown_type_node;
       /* Note that we do not convert OBJECT to the BASELINK_BINFO
         base.  That will happen when the function is called.  */
-      result = build3 (COMPONENT_REF, type, object, member, NULL_TREE);
+      result = build3_loc (input_location, COMPONENT_REF, type, object, member,
+                          NULL_TREE);
     }
   else if (TREE_CODE (member) == CONST_DECL)
     {
index 88cda1a9df24196833085dfec6d167a95bf8102d..398b45e2dc70ffac3d7a13f4c51404ff44b76ad3 100644 (file)
@@ -1,5 +1,8 @@
 2019-03-01  Marek Polacek  <polacek@redhat.com>
 
+       PR c++/89537 - missing location for error with non-static member fn.
+       * g++.dg/diagnostic/member-fn-1.C: New test.
+
        PR c++/89532 - ICE with incomplete type in decltype.
        * g++.dg/cpp2a/nontype-class14.C: New test.
 
diff --git a/gcc/testsuite/g++.dg/diagnostic/member-fn-1.C b/gcc/testsuite/g++.dg/diagnostic/member-fn-1.C
new file mode 100644 (file)
index 0000000..6d965d4
--- /dev/null
@@ -0,0 +1,38 @@
+// PR c++/89537
+// { dg-do compile { target c++11 } }
+
+template <typename> class A {};
+template <typename, typename, typename, typename> class B;
+class C {
+  using mapped_type = int;
+
+public:
+  template <typename _Compare>
+  C(B<mapped_type, _Compare, A<int>, A<int>> *p1, unsigned)
+      : keys(p1->keys), // { dg-error "18: invalid use of non-static member function" }
+        values(p1->values) {} // { dg-error "20: invalid use of non-static member function" }
+  A<int> keys;
+  A<int> values;
+};
+class D {
+public:
+  using key_compare = int;
+  template <typename _Alloc> D(key_compare, _Alloc);
+};
+template <typename _Tp, typename, typename, typename = A<_Tp>> class B {
+  using _Impl = D;
+  _Impl _M_impl;
+
+public:
+  using key_compare = int;
+  using iterator = C;
+  template <typename _Alloc> B(key_compare p1, _Alloc p2) : _M_impl(p1, p2) {}
+  template <typename _Alloc> B(_Alloc p1) : B(key_compare(), p1) {}
+  iterator begin() { return {this, 0}; }
+  void keys();
+  void values();
+};
+void fn1() {
+  B<int, int, A<int>> m(fn1);
+  m.begin();
+}