diff options
author | Dodji Seketeli <dodji@redhat.com> | 2009-04-02 09:24:19 +0000 |
---|---|---|
committer | Dodji Seketeli <dodji@gcc.gnu.org> | 2009-04-02 11:24:19 +0200 |
commit | d0940d56623ac8e6e6f43c873d039c2466bb6798 (patch) | |
tree | 4ae7dcdc112d00327f2e63a2d51dc32abfd729db /gcc/cp/class.c | |
parent | bf1cbdc6e43e3a62ef6ecac786ac70ecf5851ef6 (diff) | |
download | gcc-d0940d56623ac8e6e6f43c873d039c2466bb6798.zip gcc-d0940d56623ac8e6e6f43c873d039c2466bb6798.tar.gz gcc-d0940d56623ac8e6e6f43c873d039c2466bb6798.tar.bz2 |
re PR c++/26693 (Access checks not performed for types in templates)
gcc/ChangeLog:
2009-04-02 Dodji Seketeli <dodji@redhat.com>
PR c++/26693
* c-decl.c: (clone_underlying_type): Move this ...
* c-common.c (set_underlying_type): ... here.
Also, make sure the function properly sets TYPE_STUB_DECL() on
the newly created typedef variant type.
* c-common.h (is_typedef_decl, set_underlying_type): Declare ...
* c-common.c (is_typedef_decl, set_underlying_type): ... new entry points.
gcc/cp/ChangeLog:
2009-04-02 Dodji Seketeli <dodji@redhat.com>
PR c++/26693
* decl2.c (grokfield): when a typedef appears in a
class, create the typedef variant type node for it.
(save_template_attributes): Creating typedef variant type node
here is now useless.
* decl.c (grokdeclarator): If the typedef'ed struct/class was
anonymous, set the proper type name to all its type variants.
(xref_basetypes) : Fixup the variant types after setting
TYPE_BINFO on REF.
* name-lookup.c (pushdecl_maybe_friend): Reuse the
set_underlying_type function to install typedef variant types.
* cp-tree.h (MEMBER_TYPES_NEEDING_ACCESS_CHECK): New template accessor
macro.
(append_type_to_template_for_access_check): New entry points.
* semantics.c (check_accessibility_of_qualified_id):
When a typedef that is a member of a class appears in a template,
add it to the template. It will be ...
* class.c (finish_struct_bits): Split type variant fixup into ...
(fixup_type_variants): A new entry point.
* pt.c (instantiate_class_template, instantiate_template ): ... access
checked at template instantiation time.
(resolve_type_name_type): The type name should be the name of the
main type variant.
(retrieve_specialization): Specializations of template typedefs aren't
to be looked up in DECL_TEMPLATE_INSTANTIATIONS (tmpl).
(append_type_to_template_for_access_check): New entry point.
(tsubst_decl): For typedefs, build the variant type from the correct
original type.
(get_class_bindings): Fix function comment.
(perform_typedefs_access_check): New entry point.
gcc/testsuite/ChangeLog:
2009-04-02 Dodji Seketeli <dodji@redhat.com>
PR c++/26693
* g++.dg/template/typedef11.C: New test.
* g++.dg/template/typedef12.C: Likewise.
* g++.dg/template/typedef13.C: Likewise.
* g++.dg/template/typedef14.C: Likewise.
* g++.dg/template/typedef15.C: Likewise.
* g++.dg/template/typedef16.C: Likewise.
* g++.dg/template/sfinae3.C: Compile this pedantically.
The only errors expected should be the one saying the typedef is ill
formed.
* g++.old-deja/g++.pt/typename8.C: Likewise.
* g++.dg/template/access11.C: Update this.
libstdc++-v3/ChangeLog:
2009-04-02 Dodji Seketeli <dodji@redhat.com>
* include/ext/bitmap_allocator.h: the typedefs should be made public
if we want them to be accessible. This has been revealed by the patch
that fixes PR c++/26693 in g++.
From-SVN: r145440
Diffstat (limited to 'gcc/cp/class.c')
-rw-r--r-- | gcc/cp/class.c | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/gcc/cp/class.c b/gcc/cp/class.c index b8553ef..c1885be 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -1439,16 +1439,17 @@ determine_primary_bases (tree t) BINFO_VIRTUALS (type_binfo) = BINFO_VIRTUALS (primary); } } - -/* Set memoizing fields and bits of T (and its variants) for later - use. */ -static void -finish_struct_bits (tree t) +/* Update the variant types of T. */ + +void +fixup_type_variants (tree t) { tree variants; - /* Fix up variants (if any). */ + if (!t) + return; + for (variants = TYPE_NEXT_VARIANT (t); variants; variants = TYPE_NEXT_VARIANT (variants)) @@ -1472,6 +1473,17 @@ finish_struct_bits (tree t) /* All variants of a class have the same attributes. */ TYPE_ATTRIBUTES (variants) = TYPE_ATTRIBUTES (t); } +} + + +/* Set memoizing fields and bits of T (and its variants) for later + use. */ + +static void +finish_struct_bits (tree t) +{ + /* Fix up variants (if any). */ + fixup_type_variants (t); if (BINFO_N_BASE_BINFOS (TYPE_BINFO (t)) && TYPE_POLYMORPHIC_P (t)) /* For a class w/o baseclasses, 'finish_struct' has set |