This revision was landed with ongoing or failed builds. This revision was automatically updated to reflect the committed changes. Closed by commit rG256a0b298c68: [clang] Correct source locations for instantiations of function templates. (authored by tahonermann).
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D64087/new/ https://reviews.llvm.org/D64087 Files: 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
Index: clang/test/SemaTemplate/virtual-member-functions.cpp =================================================================== --- clang/test/SemaTemplate/virtual-member-functions.cpp +++ 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 @@ 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}} Index: clang/test/SemaCXX/member-init.cpp =================================================================== --- clang/test/SemaCXX/member-init.cpp +++ clang/test/SemaCXX/member-init.cpp @@ -164,11 +164,11 @@ 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 @@ } 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}} +} Index: clang/test/SemaCXX/cxx2b-consteval-propagate.cpp =================================================================== --- clang/test/SemaCXX/cxx2b-consteval-propagate.cpp +++ clang/test/SemaCXX/cxx2b-consteval-propagate.cpp @@ -102,14 +102,14 @@ 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}} } } Index: clang/test/CXX/class/class.compare/class.compare.default/p1.cpp =================================================================== --- clang/test/CXX/class/class.compare/class.compare.default/p1.cpp +++ clang/test/CXX/class/class.compare/class.compare.default/p1.cpp @@ -209,10 +209,10 @@ 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}} Index: clang/lib/Sema/SemaTemplateInstantiateDecl.cpp =================================================================== --- clang/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ clang/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -4990,8 +4990,10 @@ // 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); Index: clang/docs/ReleaseNotes.rst =================================================================== --- clang/docs/ReleaseNotes.rst +++ clang/docs/ReleaseNotes.rst @@ -291,6 +291,12 @@ 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.
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits