OSDN Git Service

PR c++/4802, c++/5387
authorlerdsuwa <lerdsuwa@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 17 Jul 2002 13:56:46 +0000 (13:56 +0000)
committerlerdsuwa <lerdsuwa@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 17 Jul 2002 13:56:46 +0000 (13:56 +0000)
* decl.c (make_typename_type): Use enforce_access.

* g++.dg/template/access2.C: New test.
* g++.dg/template/access3.C: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@55517 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/access2.C [new file with mode: 0644]
gcc/testsuite/g++.dg/template/access3.C [new file with mode: 0644]

index ea8e39c..bfa365b 100644 (file)
@@ -1,3 +1,8 @@
+2002-07-17  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
+
+       PR c++/4802, c++/5387
+       * decl.c (make_typename_type): Use enforce_access.
+
 2002-07-17  Scott Snyder <snyder@fnal.gov>
 
        PR c++/7320
index 11d8fe5..c6d77d3 100644 (file)
@@ -5652,6 +5652,9 @@ make_typename_type (context, name, complain)
              return error_mark_node;
            }
 
+         if (!enforce_access (context, tmpl))
+           return error_mark_node;
+
          return lookup_template_class (tmpl,
                                        TREE_OPERAND (fullname, 1),
                                        NULL_TREE, context,
@@ -5672,6 +5675,9 @@ make_typename_type (context, name, complain)
          t = lookup_field (context, name, 0, 1);
          if (t)
            {
+             if (!enforce_access (context, t))
+               return error_mark_node;
+
              if (DECL_ARTIFICIAL (t) || !(complain & tf_keep_type_decl))
                t = TREE_TYPE (t);
              if (IMPLICIT_TYPENAME_P (t))
index 77bbae2..a08eab9 100644 (file)
@@ -1,3 +1,8 @@
+2002-07-17  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
+
+       * g++.dg/template/access2.C: New test.
+       * g++.dg/template/access3.C: New test.
+
 2002-07-15  Zack Weinberg  <zack@codesourcery.com>
 
        * c-torture/execute/991216-3.c, c-torture/execute/strct-varg-1.c,
diff --git a/gcc/testsuite/g++.dg/template/access2.C b/gcc/testsuite/g++.dg/template/access2.C
new file mode 100644 (file)
index 0000000..9da8ecf
--- /dev/null
@@ -0,0 +1,20 @@
+// { dg-do compile }
+
+// PR c++/5387
+// Enforcing access of typename type.
+
+template <class T> struct A {
+  typename T::X x;                     // { dg-error "this context" }
+  int f() { return T::i; }             // { dg-error "this context" }
+};
+
+class B {
+  typedef int X;                       // { dg-error "private" }
+  static int i;                                // { dg-error "private" }
+};
+
+int main()
+{
+  A<B> ab;                             // { dg-error "instantiated" }
+  ab.f();                              // { dg-error "instantiated" }
+}
diff --git a/gcc/testsuite/g++.dg/template/access3.C b/gcc/testsuite/g++.dg/template/access3.C
new file mode 100644 (file)
index 0000000..1674f5f
--- /dev/null
@@ -0,0 +1,17 @@
+// { dg-do compile }
+
+// PR c++/5387
+// Enforcing access of typename type.
+
+template <class T> struct A {
+  typename T::X<int> x;                        // { dg-error "this context" }
+};
+
+class B {
+  template <class T> class X {};       // { dg-error "private" }
+};
+
+int main()
+{
+  A<B> ab;                             // { dg-error "instantiated" }
+}