blob: 52e1c41478393c51792d478d06186ec07762c179 [file] [log] [blame]
Reid Klecknerae818502016-10-20 20:53:20 +00001// RUN: %clang_cc1 -verify %s
Paul Robinson80ba2922016-12-21 18:33:17 +00002// RUN: %clang_cc1 -verify %s -std=c++98
3// RUN: %clang_cc1 -verify %s -std=c++11
Richard Smith600b5262017-01-26 20:40:47 +00004// RUN: %clang_cc1 -verify %s -std=c++1z
Reid Klecknerae818502016-10-20 20:53:20 +00005
6// PR25946
7// We had an off-by-one error in an assertion when annotating A<int> below. Our
8// error recovery checks if A<int> is a constructor declarator, and opens a
9// TentativeParsingAction. Then we attempt to annotate the token at the exact
10// position that we want to possibly backtrack to, and this used to crash.
11
12template <typename T> class A {};
13
14// expected-error@+1 {{expected '{' after base class list}}
15template <typename T> class B : T // not ',' or '{'
Paul Robinson80ba2922016-12-21 18:33:17 +000016#if __cplusplus < 201103L
Richard Smith600b5262017-01-26 20:40:47 +000017// expected-error@+8 {{expected ';' after top level declarator}}
Paul Robinson80ba2922016-12-21 18:33:17 +000018#endif
Richard Smith600b5262017-01-26 20:40:47 +000019#if __cplusplus <= 201402L
20// expected-error@+5 {{C++ requires a type specifier for all declarations}}
21#else
22// expected-error@+3 {{expected unqualified-id}}
23#endif
Reid Klecknerae818502016-10-20 20:53:20 +000024// expected-error@+1 {{expected ';' after class}}
25A<int> {
26};