mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-28 12:06:09 +00:00

The parser was dealing with unexpected "template" keywords after "using" keywords too late and putting the parser into the wrong state, which could lead to a crash down the line. This change allows the parser to consume the bad "template" keywords earlier, and continue parsing as if "template" was never there to begin with for better error recovery. llvm-svn: 359740
53 lines
1.1 KiB
C++
53 lines
1.1 KiB
C++
// RUN: %clang_cc1 %s -verify
|
|
|
|
namespace N1 {
|
|
template <typename... Ts>
|
|
struct Foo {
|
|
template <typename T>
|
|
struct Bar {
|
|
static constexpr bool is_present = false;
|
|
};
|
|
};
|
|
|
|
template <typename T, typename... Ts>
|
|
struct Foo<T, Ts...> : public Foo<Ts...> {
|
|
using template Foo<Ts...>::Bar;
|
|
// expected-error@-1 {{'template' keyword not permitted after 'using' keyword}}
|
|
};
|
|
}
|
|
|
|
namespace N2 {
|
|
namespace foo {
|
|
using I = int;
|
|
}
|
|
using template namespace foo;
|
|
// expected-error@-1 {{'template' keyword not permitted after 'using' keyword}}
|
|
using template template namespace foo;
|
|
// expected-error@-1 2{{'template' keyword not permitted after 'using' keyword}}
|
|
I i;
|
|
}
|
|
|
|
namespace N3 {
|
|
namespace foo {
|
|
using I = int;
|
|
}
|
|
using template foo::I;
|
|
// expected-error@-1 {{'template' keyword not permitted after 'using' keyword}}
|
|
I i;
|
|
}
|
|
|
|
namespace N4 {
|
|
template <typename T>
|
|
class A {};
|
|
|
|
template <typename T>
|
|
using B = A<T>;
|
|
B<int> b;
|
|
|
|
using template <typename T> C = A<T>;
|
|
// expected-error@-1 {{'template' keyword not permitted after 'using' keyword}}
|
|
// expected-error@-2 {{expected unqualified-id}}
|
|
C<int> c;
|
|
// expected-error@-1 {{no template named 'C'}}
|
|
}
|