aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/cp/parser.cc8
-rw-r--r--gcc/testsuite/g++.dg/parse/pr113788.C20
2 files changed, 25 insertions, 3 deletions
diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc
index 3748ccd..c4292c4 100644
--- a/gcc/cp/parser.cc
+++ b/gcc/cp/parser.cc
@@ -2088,7 +2088,9 @@ enum
/* When parsing of the noexcept-specifier should be delayed. */
CP_PARSER_FLAGS_DELAY_NOEXCEPT = 0x40,
/* When parsing a consteval declarator. */
- CP_PARSER_FLAGS_CONSTEVAL = 0x80
+ CP_PARSER_FLAGS_CONSTEVAL = 0x80,
+ /* When parsing a parameter declaration. */
+ CP_PARSER_FLAGS_PARAMETER = 0x100
};
/* This type is used for parameters and variables which hold
@@ -16342,7 +16344,7 @@ cp_parser_decl_specifier_seq (cp_parser* parser,
/* Special case for "this" specifier, indicating a parm is an xobj parm.
The "this" specifier must be the first specifier in the declaration,
after any attributes. */
- if (token->keyword == RID_THIS)
+ if (token->keyword == RID_THIS && (flags & CP_PARSER_FLAGS_PARAMETER))
{
cp_lexer_consume_token (parser->lexer);
if (token != first_specifier)
@@ -25607,7 +25609,7 @@ cp_parser_parameter_declaration (cp_parser *parser,
/* Parse the declaration-specifiers. */
cp_token *decl_spec_token_start = cp_lexer_peek_token (parser->lexer);
cp_parser_decl_specifier_seq (parser,
- flags,
+ flags | CP_PARSER_FLAGS_PARAMETER,
&decl_specifiers,
&declares_class_or_enum);
diff --git a/gcc/testsuite/g++.dg/parse/pr113788.C b/gcc/testsuite/g++.dg/parse/pr113788.C
new file mode 100644
index 0000000..d255037
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/pr113788.C
@@ -0,0 +1,20 @@
+// PR c++/113788
+// { dg-do compile { target c++11 } }
+
+struct S { int a, b; };
+struct U {
+ void foo () { this int g = 1; } // { dg-error "expected ';' before 'int'" }
+};
+this auto h = 1; // { dg-error "expected unqualified-id before 'this'" }
+
+int
+main ()
+{
+ S s = { 1, 2 };
+ short t[3] = { 3, 4, 5 };
+ this auto &[a, b] = s; // { dg-error "invalid use of 'this' in non-member function" }
+ this auto &[c, d, e] = t; // { dg-error "invalid use of 'this' in non-member function" }
+ this int f = 1; // { dg-error "invalid use of 'this' in non-member function" }
+ for (this auto &i : t) // { dg-error "invalid use of 'this' in non-member function" }
+ ; // { dg-error "expected" }
+} // { dg-error "expected" }