cor3ntin updated this revision to Diff 528811.
cor3ntin added a comment.
Add test for default parameters
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D152242/new/
https://reviews.llvm.org/D152242
Files:
clang/docs/ReleaseNotes.rst
clang/lib/Parse/ParseDecl.cpp
clang/test/CXX/temp/temp.res/p4.cpp
Index: clang/test/CXX/temp/temp.res/p4.cpp
===================================================================
--- clang/test/CXX/temp/temp.res/p4.cpp
+++ clang/test/CXX/temp/temp.res/p4.cpp
@@ -170,3 +170,18 @@
template <typename T>
C<T>::C(T::type) {}
+
+namespace GH63119 {
+struct X {
+ X(int);
+ X(auto);
+ void f(int);
+};
+template<typename T> struct S {
+ friend X::X(T::type);
+ friend X::X(T::type = (int)(void(*)(typename T::type))(nullptr)); //
expected-error {{friend declaration specifying a default argument must be a
definition}}
+ friend X::X(T::type = (int)(void(*)(T::type))(nullptr)); // expected-error
{{friend declaration specifying a default argument must be a definition}} \
+ // expected-error
{{expected expression}}
+ friend void X::f(T::type);
+};
+}
Index: clang/lib/Parse/ParseDecl.cpp
===================================================================
--- clang/lib/Parse/ParseDecl.cpp
+++ clang/lib/Parse/ParseDecl.cpp
@@ -5820,9 +5820,12 @@
// therefore, we know that this is a constructor.
// Due to an ambiguity with implicit typename, the above is not enough.
// Additionally, check to see if we are a friend.
+ // If we parsed a scope specifier as well as friend,
+ // we might be parsing a friend constructor.
bool IsConstructor = false;
- if (isDeclarationSpecifier(IsFriend ? ImplicitTypenameContext::No
- : ImplicitTypenameContext::Yes))
+ if (isDeclarationSpecifier(IsFriend && !SS.isSet()
+ ? ImplicitTypenameContext::No
+ : ImplicitTypenameContext::Yes))
IsConstructor = true;
else if (Tok.is(tok::identifier) ||
(Tok.is(tok::annot_cxxscope) && NextToken().is(tok::identifier))) {
Index: clang/docs/ReleaseNotes.rst
===================================================================
--- clang/docs/ReleaseNotes.rst
+++ clang/docs/ReleaseNotes.rst
@@ -521,6 +521,9 @@
(`#62494 <https://github.com/llvm/llvm-project/issues/62494>`_)
- Fix handling of generic lambda used as template arguments.
(`#62611 <https://github.com/llvm/llvm-project/issues/62611>`_)
+- Allow omitting ``typename`` in the parameter declaration of a friend
+ constructor declaration.
+ (`#63119 <https://github.com/llvm/llvm-project/issues/63119>`_)
Bug Fixes to AST Handling
^^^^^^^^^^^^^^^^^^^^^^^^^
Index: clang/test/CXX/temp/temp.res/p4.cpp
===================================================================
--- clang/test/CXX/temp/temp.res/p4.cpp
+++ clang/test/CXX/temp/temp.res/p4.cpp
@@ -170,3 +170,18 @@
template <typename T>
C<T>::C(T::type) {}
+
+namespace GH63119 {
+struct X {
+ X(int);
+ X(auto);
+ void f(int);
+};
+template<typename T> struct S {
+ friend X::X(T::type);
+ friend X::X(T::type = (int)(void(*)(typename T::type))(nullptr)); // expected-error {{friend declaration specifying a default argument must be a definition}}
+ friend X::X(T::type = (int)(void(*)(T::type))(nullptr)); // expected-error {{friend declaration specifying a default argument must be a definition}} \
+ // expected-error {{expected expression}}
+ friend void X::f(T::type);
+};
+}
Index: clang/lib/Parse/ParseDecl.cpp
===================================================================
--- clang/lib/Parse/ParseDecl.cpp
+++ clang/lib/Parse/ParseDecl.cpp
@@ -5820,9 +5820,12 @@
// therefore, we know that this is a constructor.
// Due to an ambiguity with implicit typename, the above is not enough.
// Additionally, check to see if we are a friend.
+ // If we parsed a scope specifier as well as friend,
+ // we might be parsing a friend constructor.
bool IsConstructor = false;
- if (isDeclarationSpecifier(IsFriend ? ImplicitTypenameContext::No
- : ImplicitTypenameContext::Yes))
+ if (isDeclarationSpecifier(IsFriend && !SS.isSet()
+ ? ImplicitTypenameContext::No
+ : ImplicitTypenameContext::Yes))
IsConstructor = true;
else if (Tok.is(tok::identifier) ||
(Tok.is(tok::annot_cxxscope) && NextToken().is(tok::identifier))) {
Index: clang/docs/ReleaseNotes.rst
===================================================================
--- clang/docs/ReleaseNotes.rst
+++ clang/docs/ReleaseNotes.rst
@@ -521,6 +521,9 @@
(`#62494 <https://github.com/llvm/llvm-project/issues/62494>`_)
- Fix handling of generic lambda used as template arguments.
(`#62611 <https://github.com/llvm/llvm-project/issues/62611>`_)
+- Allow omitting ``typename`` in the parameter declaration of a friend
+ constructor declaration.
+ (`#63119 <https://github.com/llvm/llvm-project/issues/63119>`_)
Bug Fixes to AST Handling
^^^^^^^^^^^^^^^^^^^^^^^^^
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits