aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2012-07-17 14:08:59 -0400
committerJason Merrill <jason@gcc.gnu.org>2012-07-17 14:08:59 -0400
commitec44e46396e6bc7f393ceb10d84df22b9b45f820 (patch)
tree5107b10c0438bd6ed62fa2a6257a2fa978c9d215 /gcc/cp
parent65876d249e4992e87c5c6aa30a87dfac88752a60 (diff)
downloadgcc-ec44e46396e6bc7f393ceb10d84df22b9b45f820.zip
gcc-ec44e46396e6bc7f393ceb10d84df22b9b45f820.tar.gz
gcc-ec44e46396e6bc7f393ceb10d84df22b9b45f820.tar.bz2
re PR c++/53549 (g++ and armadillo 3.2.0, operator() is inaccessible)
PR c++/53549 * parser.c (cp_parser_class_head): Call xref_basetypes here. (cp_parser_class_specifier_1): Not here. * pt.c (tsubst_decl) [USING_DECL]: Check uses_template_parms as well as DECL_DEPENDENT_P. From-SVN: r189582
Diffstat (limited to 'gcc/cp')
-rw-r--r--gcc/cp/ChangeLog8
-rw-r--r--gcc/cp/parser.c34
-rw-r--r--gcc/cp/pt.c8
3 files changed, 27 insertions, 23 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index a8b19ae..142a866 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,11 @@
+2012-07-17 Jason Merrill <jason@redhat.com>
+
+ PR c++/53549
+ * parser.c (cp_parser_class_head): Call xref_basetypes here.
+ (cp_parser_class_specifier_1): Not here.
+ * pt.c (tsubst_decl) [USING_DECL]: Check uses_template_parms
+ as well as DECL_DEPENDENT_P.
+
2012-07-16 Jason Merrill <jason@redhat.com>
* cp-tree.h (struct deferred_access_check): Add location.
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 1428a26..df23299 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -2008,7 +2008,7 @@ static tree cp_parser_class_name
static tree cp_parser_class_specifier
(cp_parser *);
static tree cp_parser_class_head
- (cp_parser *, bool *, tree *);
+ (cp_parser *, bool *);
static enum tag_types cp_parser_class_key
(cp_parser *);
static void cp_parser_member_specification_opt
@@ -17961,15 +17961,13 @@ cp_parser_class_specifier_1 (cp_parser* parser)
bool saved_in_unbraced_linkage_specification_p;
tree old_scope = NULL_TREE;
tree scope = NULL_TREE;
- tree bases;
cp_token *closing_brace;
push_deferring_access_checks (dk_no_deferred);
/* Parse the class-head. */
type = cp_parser_class_head (parser,
- &nested_name_specifier_p,
- &bases);
+ &nested_name_specifier_p);
/* If the class-head was a semantic disaster, skip the entire body
of the class. */
if (!type)
@@ -17986,18 +17984,6 @@ cp_parser_class_specifier_1 (cp_parser* parser)
return error_mark_node;
}
- /* Process the base classes. If they're invalid, skip the
- entire class body. */
- if (!xref_basetypes (type, bases))
- {
- /* Consuming the closing brace yields better error messages
- later on. */
- if (cp_parser_skip_to_closing_brace (parser))
- cp_lexer_consume_token (parser->lexer);
- pop_deferring_access_checks ();
- return error_mark_node;
- }
-
/* Issue an error message if type-definitions are forbidden here. */
cp_parser_check_type_definition (parser);
/* Remember that we are defining one more class. */
@@ -18283,14 +18269,14 @@ cp_parser_class_specifier (cp_parser* parser)
static tree
cp_parser_class_head (cp_parser* parser,
- bool* nested_name_specifier_p,
- tree *bases)
+ bool* nested_name_specifier_p)
{
tree nested_name_specifier;
enum tag_types class_key;
tree id = NULL_TREE;
tree type = NULL_TREE;
tree attributes;
+ tree bases;
cp_virt_specifiers virt_specifiers = VIRT_SPEC_UNSPECIFIED;
bool template_id_p = false;
bool qualified_p = false;
@@ -18307,8 +18293,6 @@ cp_parser_class_head (cp_parser* parser,
num_templates = 0;
parser->colon_corrects_to_scope_p = false;
- *bases = NULL_TREE;
-
/* Look for the class-key. */
class_key = cp_parser_class_key (parser);
if (class_key == none_type)
@@ -18671,7 +18655,15 @@ cp_parser_class_head (cp_parser* parser,
/* Get the list of base-classes, if there is one. */
if (cp_lexer_next_token_is (parser->lexer, CPP_COLON))
- *bases = cp_parser_base_clause (parser);
+ bases = cp_parser_base_clause (parser);
+ else
+ bases = NULL_TREE;
+
+ /* If we're really defining a class, process the base classes.
+ If they're invalid, fail. */
+ if (type && cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE)
+ && !xref_basetypes (type, bases))
+ type = NULL_TREE;
done:
/* Leave the scope given by the nested-name-specifier. We will
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 95c6464..542f57a 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -10235,8 +10235,12 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
break;
case USING_DECL:
- /* We reach here only for member using decls. */
- if (DECL_DEPENDENT_P (t))
+ /* We reach here only for member using decls. We also need to check
+ uses_template_parms because DECL_DEPENDENT_P is not set for a
+ using-declaration that designates a member of the current
+ instantiation (c++/53549). */
+ if (DECL_DEPENDENT_P (t)
+ || uses_template_parms (USING_DECL_SCOPE (t)))
{
r = do_class_using_decl
(tsubst_copy (USING_DECL_SCOPE (t), args, complain, in_decl),