diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index e6e6ed72a42..b6f94bdda23 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -22193,7 +22193,7 @@ cp_parser_direct_declarator (cp_parser* parser, tree save_ccp = current_class_ptr; tree save_ccr = current_class_ref; - if (memfn && !friend_p) + if (memfn && !friend_p && !static_p) /* DR 1207: 'this' is in scope after the cv-quals. */ inject_this_parameter (current_class_type, cv_quals); @@ -35283,7 +35283,6 @@ cp_parser_omp_var_list_no_open (cp_parser *parser, enum omp_clause_code kind, cp_parser_parse_tentatively (parser); token = cp_lexer_peek_token (parser->lexer); if (kind != 0 - && current_class_ptr && cp_parser_is_keyword (token, RID_THIS)) { decl = finish_this_expr (); diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-this1.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-this1.C new file mode 100644 index 00000000000..e50218d0706 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-this1.C @@ -0,0 +1,10 @@ +// PR c++/98800 +// { dg-do compile { target c++11 } } + +template struct enable_if_t {}; +struct tmp { + template constexpr bool is_integral(); + template static auto func() -> enable_if_t()>; // { dg-error "without object" } +}; +template constexpr bool tmp::is_integral() { return true; } +int main() { tmp::func(); } // { dg-error "no match" } diff --git a/gcc/testsuite/g++.dg/gomp/this-1.C b/gcc/testsuite/g++.dg/gomp/this-1.C index 30ab8b3903c..e7bd5831118 100644 --- a/gcc/testsuite/g++.dg/gomp/this-1.C +++ b/gcc/testsuite/g++.dg/gomp/this-1.C @@ -3,7 +3,7 @@ struct S { - #pragma omp declare simd linear(this) // { dg-error "is not a function argument" } + #pragma omp declare simd linear(this) // { dg-error "invalid use of .this" } static void foo (); void bar (); }; @@ -35,7 +35,7 @@ S::bar () template struct T { - #pragma omp declare simd linear(this) // { dg-error "is not a function argument" } + #pragma omp declare simd linear(this) // { dg-error "invalid use of .this" } static void foo (); void bar (); };