Author: Tom Honermann Date: 2023-09-18T12:51:45-07:00 New Revision: 256a0b298c68b89688b80350b034daf2f7785b67
URL: https://github.com/llvm/llvm-project/commit/256a0b298c68b89688b80350b034daf2f7785b67 DIFF: https://github.com/llvm/llvm-project/commit/256a0b298c68b89688b80350b034daf2f7785b67.diff LOG: [clang] Correct source locations for instantiations of function templates. This change corrects some cases where the source location for an instantiated specialization of a function template or a member function of a class template was assigned the location of a non-defining declaration rather than the location of the definition the specialization was instantiated from. Fixes https://github.com/llvm/llvm-project/issues/26057 Reviewed By: cor3ntin Differential Revision: https://reviews.llvm.org/D64087 Added: Modified: clang/docs/ReleaseNotes.rst clang/lib/Sema/SemaTemplateInstantiateDecl.cpp clang/test/CXX/class/class.compare/class.compare.default/p1.cpp clang/test/SemaCXX/cxx2b-consteval-propagate.cpp clang/test/SemaCXX/member-init.cpp clang/test/SemaTemplate/virtual-member-functions.cpp Removed: ################################################################################ diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 500f9c9a0cda741..7e964f6eb435bb0 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -291,6 +291,12 @@ Bug Fixes to C++ Support pointers on win32. (`#62594 <https://github.com/llvm/llvm-project/issues/62594>`_) +- Fixed some cases where the source location for an instantiated specialization + of a function template or a member function of a class template was assigned + the location of a non-defining declaration rather than the location of the + definition the specialization was instantiated from. + (`#26057 <https://github.com/llvm/llvm-project/issues/26057>`_`) + Bug Fixes to AST Handling ^^^^^^^^^^^^^^^^^^^^^^^^^ - Fixed an import failure of recursive friend class template. diff --git a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp index 37a7d6204413a38..fa839e9b71a3cf9 100644 --- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -4990,8 +4990,10 @@ void Sema::InstantiateFunctionDefinition(SourceLocation PointOfInstantiation, // unimported module. Function->setVisibleDespiteOwningModule(); - // Copy the inner loc start from the pattern. + // Copy the source locations from the pattern. + Function->setLocation(PatternDecl->getLocation()); Function->setInnerLocStart(PatternDecl->getInnerLocStart()); + Function->setRangeEnd(PatternDecl->getEndLoc()); EnterExpressionEvaluationContext EvalContext( *this, Sema::ExpressionEvaluationContext::PotentiallyEvaluated); diff --git a/clang/test/CXX/class/class.compare/class.compare.default/p1.cpp b/clang/test/CXX/class/class.compare/class.compare.default/p1.cpp index b595825e1750adc..252860bfc4de077 100644 --- a/clang/test/CXX/class/class.compare/class.compare.default/p1.cpp +++ b/clang/test/CXX/class/class.compare/class.compare.default/p1.cpp @@ -209,10 +209,10 @@ bool operator==(e *, int *) = default; // expected-error{{must have at least one namespace p2085_2 { template <class T> struct S6 { - // expected-error@+2{{found 'const int &'}} - // expected-error@+1{{found 'const float &'}} bool operator==(T const &) const; }; +// expected-error@+2{{found 'const int &'}} +// expected-error@+1{{found 'const float &'}} template <class T> bool S6<T>::operator==(T const &) const = default; template struct S6<int>; // expected-note{{S6<int>::operator==' requested}} diff --git a/clang/test/SemaCXX/cxx2b-consteval-propagate.cpp b/clang/test/SemaCXX/cxx2b-consteval-propagate.cpp index c5eb7f139327505..def3bbb8adf0fce 100644 --- a/clang/test/SemaCXX/cxx2b-consteval-propagate.cpp +++ b/clang/test/SemaCXX/cxx2b-consteval-propagate.cpp @@ -102,14 +102,14 @@ constexpr int f(T t) { namespace forward_declare_consteval{ template <typename T> -constexpr int f(T t); // expected-note {{'f<int>' defined here}} +constexpr int f(T t); auto a = &f<char>; auto b = &f<int>; // expected-error {{immediate function 'f<int>' used before it is defined}} \ // expected-note {{in instantiation of function template specialization}} template <typename T> -constexpr int f(T t) { +constexpr int f(T t) { // expected-note {{'f<int>' defined here}} return id(t); // expected-note {{'f<int>' is an immediate function because its body contains a call to a consteval function 'id' and that call is not a constant expression}} } } diff --git a/clang/test/SemaCXX/member-init.cpp b/clang/test/SemaCXX/member-init.cpp index e98a66ca9cab9f4..087561e679f4eae 100644 --- a/clang/test/SemaCXX/member-init.cpp +++ b/clang/test/SemaCXX/member-init.cpp @@ -164,11 +164,11 @@ struct A { namespace explicit_instantiation { template<typename T> struct X { - X(); // expected-note {{in instantiation of default member initializer 'explicit_instantiation::X<float>::n' requested here}} + X(); int n = T::error; // expected-error {{type 'float' cannot be used prior to '::' because it has no members}} }; template struct X<int>; // ok -template<typename T> X<T>::X() {} +template<typename T> X<T>::X() {} // expected-note {{in instantiation of default member initializer 'explicit_instantiation::X<float>::n' requested here}} template struct X<float>; // expected-note {{in instantiation of member function 'explicit_instantiation::X<float>::X' requested here}} } @@ -197,3 +197,15 @@ void foo(T v) { } template void foo(int); } + +namespace GH26057 { +template<typename T> +struct S { + S(); + int dm = T::error; // expected-error {{type 'int' cannot be used prior to '::' because it has no members}} +}; +template<typename T> +S<T>::S() = default; // expected-note {{in instantiation of default member initializer 'GH26057::S<int>::dm' requested here}} \ + // expected-note {{in evaluation of exception specification for 'GH26057::S<int>::S' needed here}} +template struct S<int>; // expected-note {{in instantiation of member function 'GH26057::S<int>::S' requested here}} +} diff --git a/clang/test/SemaTemplate/virtual-member-functions.cpp b/clang/test/SemaTemplate/virtual-member-functions.cpp index cc4d51e7dc43fd1..4e505e53986a37a 100644 --- a/clang/test/SemaTemplate/virtual-member-functions.cpp +++ b/clang/test/SemaTemplate/virtual-member-functions.cpp @@ -7,10 +7,10 @@ namespace PR5557 { template <class T> struct A { - A(); // expected-note{{instantiation}} + A(); virtual int a(T x); }; -template<class T> A<T>::A() {} +template<class T> A<T>::A() {} // expected-note{{instantiation}} template<class T> int A<T>::a(T x) { return *x; // expected-error{{requires pointer operand}} @@ -33,10 +33,10 @@ void X<int>::f() { } namespace PR5557_dtor { template <class T> struct A { A(); // Don't have an implicit constructor. - ~A(); // expected-note{{instantiation}} + ~A(); virtual int a(T x); }; -template<class T> A<T>::~A() {} +template<class T> A<T>::~A() {} // expected-note{{instantiation}} template<class T> int A<T>::a(T x) { return *x; // expected-error{{requires pointer operand}} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits