diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/parser.cc | 10 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/parse/pr116071.C | 18 |
2 files changed, 25 insertions, 3 deletions
diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc index 1fa0780..f79736c 100644 --- a/gcc/cp/parser.cc +++ b/gcc/cp/parser.cc @@ -20786,9 +20786,13 @@ cp_parser_simple_type_specifier (cp_parser* parser, } /* If it didn't work out, we don't have a TYPE. */ - if ((flags & CP_PARSER_FLAGS_OPTIONAL) - && !cp_parser_parse_definitely (parser)) - type = NULL_TREE; + if (flags & CP_PARSER_FLAGS_OPTIONAL) + { + if (!type) + cp_parser_simulate_error (parser); + if (!cp_parser_parse_definitely (parser)) + type = NULL_TREE; + } /* Keep track of all name-lookups performed in class scopes. */ if (type diff --git a/gcc/testsuite/g++.dg/parse/pr116071.C b/gcc/testsuite/g++.dg/parse/pr116071.C new file mode 100644 index 0000000..7590782 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/pr116071.C @@ -0,0 +1,18 @@ +// PR c++/116071 +// { dg-options "-std=c++14 -fconcepts" } + +template<class T> struct S { ~S(); }; +template<class T> S<T>::~S() { } + +template<typename MemPtr> +struct result_of; + +template<typename Res, typename Class> +struct result_of<Res Class::*> +{ + using type = void; +}; + +struct thread { + void join() { }; +}; |