https://github.com/philnik777 created https://github.com/llvm/llvm-project/pull/75148
None >From be2654702d4e7bc3b8689662db6011a3e148ef4d Mon Sep 17 00:00:00 2001 From: Nikolas Klauser <nikolasklau...@berlin.de> Date: Tue, 12 Dec 2023 08:47:26 +0100 Subject: [PATCH] [Clang] Allow the use of consecutive brackets as an extension in C++03 --- .../clang/Basic/DiagnosticParseKinds.td | 4 ++-- clang/test/CXX/temp/temp.param/p15.cpp | 6 +++--- clang/test/FixIt/fixit.cpp | 6 +++--- clang/test/Misc/diag-greatergreater.cpp | 2 +- clang/test/Parser/cxx-template-argument.cpp | 18 +++++++++--------- 5 files changed, 18 insertions(+), 18 deletions(-) diff --git a/clang/include/clang/Basic/DiagnosticParseKinds.td b/clang/include/clang/Basic/DiagnosticParseKinds.td index de180344fcc5c..6e5e8994f21bb 100644 --- a/clang/include/clang/Basic/DiagnosticParseKinds.td +++ b/clang/include/clang/Basic/DiagnosticParseKinds.td @@ -815,8 +815,8 @@ def err_unexpected_template_in_destructor_name : Error< "'template' keyword not permitted in destructor name">; def err_unexpected_template_after_using : Error< "'template' keyword not permitted after 'using' keyword">; -def err_two_right_angle_brackets_need_space : Error< - "a space is required between consecutive right angle brackets (use '> >')">; +def err_two_right_angle_brackets_need_space : ExtWarn< + "two consecutive right angle brackets without a space is a C++11 extension">, InGroup<CXX11>; def err_right_angle_bracket_equal_needs_space : Error< "a space is required between a right angle bracket and an equals sign " "(use '> =')">; diff --git a/clang/test/CXX/temp/temp.param/p15.cpp b/clang/test/CXX/temp/temp.param/p15.cpp index ee572e986b939..f83ef05248a34 100644 --- a/clang/test/CXX/temp/temp.param/p15.cpp +++ b/clang/test/CXX/temp/temp.param/p15.cpp @@ -3,10 +3,10 @@ template<typename T> struct X; template<int I> struct Y; X<X<int> > *x1; -X<X<int>> *x2; // expected-error{{a space is required between consecutive right angle brackets (use '> >')}} +X<X<int>> *x2; // expected-warning{{two consecutive right angle brackets without a space is a C++11 extension}} -X<X<X<X<int>> // expected-error{{a space is required between consecutive right angle brackets (use '> >')}} - >> *x3; // expected-error{{a space is required between consecutive right angle brackets (use '> >')}} +X<X<X<X<int>> // expected-warning{{two consecutive right angle brackets without a space is a C++11 extension}} + >> *x3; // expected-warning{{two consecutive right angle brackets without a space is a C++11 extension}} Y<(1 >> 2)> *y1; Y<1 >> 2> *y2; // expected-warning{{use of right-shift operator ('>>') in template argument will require parentheses in C++11}} diff --git a/clang/test/FixIt/fixit.cpp b/clang/test/FixIt/fixit.cpp index 605c2d0bd0235..d564e8e64ffc8 100644 --- a/clang/test/FixIt/fixit.cpp +++ b/clang/test/FixIt/fixit.cpp @@ -296,10 +296,10 @@ namespace greatergreater { void g() { int p = 0; (void)(t<int>==p); // expected-error {{use '> ='}} - (void)(t<int>>=p); // expected-error {{use '> >'}} + (void)(t<int>>=p); // expected-warning {{consecutive right angle brackets}} #if __cplusplus < 201103L - (void)(t<S<int>>>=p); // expected-error {{use '> >'}} - (Shr)t<S<int>>>>=p; // expected-error {{use '> >'}} + (void)(t<S<int>>>=p); // expected-warning {{consecutive right angle brackets}} + (Shr)t<S<int>>>>=p; // expected-warning {{consecutive right angle brackets}} #endif // FIXME: We correct this to 't<int> > >= p;' not 't<int> >>= p;' diff --git a/clang/test/Misc/diag-greatergreater.cpp b/clang/test/Misc/diag-greatergreater.cpp index 9110838cf3f5a..2a7e7ae376f97 100644 --- a/clang/test/Misc/diag-greatergreater.cpp +++ b/clang/test/Misc/diag-greatergreater.cpp @@ -23,7 +23,7 @@ template<int> int V; // Here, we split the >>= token into a > followed by a >=. // Then we split the >= token into a > followed by an =, // which we merge with the other = to form an ==. -// CHECK: error: a space is required +// CHECK: warning: two consecutive right angle brackets // CHECK-NEXT: int k = V<C<int>>==0; // CHECK-NEXT: ^~{{$}} // CHECK-NEXT: > >{{$}} diff --git a/clang/test/Parser/cxx-template-argument.cpp b/clang/test/Parser/cxx-template-argument.cpp index 667dd8698435b..61903f3ee7275 100644 --- a/clang/test/Parser/cxx-template-argument.cpp +++ b/clang/test/Parser/cxx-template-argument.cpp @@ -20,7 +20,7 @@ S<bool(2 > 1)> s; namespace greatergreater { template<typename T> struct S { S(); S(T); }; void f(S<int>=0); // expected-error {{a space is required between a right angle bracket and an equals sign (use '> =')}} - void f(S<S<int>>=S<int>()); // expected-error {{use '> >'}} expected-error {{use '> ='}} + void f(S<S<int>>=S<int>()); // expected-warning {{two consecutive right angle brackets}} expected-error {{use '> ='}} template<typename T> void t(); struct R { friend void operator==(void (*)(), R) {} @@ -28,12 +28,12 @@ namespace greatergreater { }; void g() { (void)(&t<int>==R()); // expected-error {{use '> ='}} - (void)(&t<int>>=R()); // expected-error {{use '> >'}} + (void)(&t<int>>=R()); // expected-warning {{two consecutive right angle brackets}} (void)(&t<S<int>>>=R()); #if __cplusplus <= 199711L - // expected-error@-2 {{use '> >'}} + // expected-warning@-2 {{two consecutive right angle brackets}} #endif - (void)(&t<S<int>>==R()); // expected-error {{use '> >'}} expected-error {{use '> ='}} + (void)(&t<S<int>>==R()); // expected-warning {{two consecutive right angle brackets}} expected-error {{use '> ='}} } } @@ -83,14 +83,14 @@ namespace pr16225add { template<class T1, typename T2> struct foo5 : UnknownBase<T1,T2,ABC<T2,T1>> // expected-error {{no template named 'UnknownBase'}} #if __cplusplus <= 199711L - // expected-error@-2 {{use '> >'}} + // expected-warning@-2 {{two consecutive right angle brackets}} #endif { }; template<class T1, typename T2> struct foo6 : UnknownBase<T1,ABC<T2,T1>>, // expected-error {{no template named 'UnknownBase'}} #if __cplusplus <= 199711L - // expected-error@-2 {{use '> >'}} + // expected-warning@-2 {{two consecutive right angle brackets}} #endif Known<T1> // expected-error {{too few template arguments for class template 'Known'}} { }; @@ -102,21 +102,21 @@ namespace pr16225add { template<class T1, typename T2> struct foo8 : UnknownBase<X<int,int>,X<int,int>> // expected-error {{no template named 'UnknownBase'}} #if __cplusplus <= 199711L - // expected-error@-2 {{use '> >'}} + // expected-warning@-2 {{two consecutive right angle brackets}} #endif { }; template<class T1, typename T2> struct foo9 : UnknownBase<Known<int,int>,X<int,int>> // expected-error {{no template named 'UnknownBase'}} #if __cplusplus <= 199711L - // expected-error@-2 {{use '> >'}} + // expected-warning@-2 {{two consecutive right angle brackets}} #endif { }; template<class T1, typename T2> struct foo10 : UnknownBase<Known<int,int>,X<int,X<int,int>>> // expected-error {{no template named 'UnknownBase'}} #if __cplusplus <= 199711L - // expected-error@-2 {{use '> >'}} + // expected-warning@-2 {{two consecutive right angle brackets}} #endif { }; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits