
Previously committed as 9e08e51a20d0d2b1c5724bb17e969d036fced4cd, and reverted because a dependency commit was reverted, then committed again as 4b574008aef5a7235c1f894ab065fe300d26e786 and reverted again because "dependency commit" 5a391d38ac6c561ba908334d427f26124ed9132e was reverted. But it doesn't seem that 5a391d38ac6c was a real dependency for this. This commit incorporates 4b574008aef5a7235c1f894ab065fe300d26e786 and 18e093faf726d15f210ab4917142beec51848258 by Richard Smith (@zygoloid), with some minor fixes, most notably: - `UncommonValue` renamed to `StructuralValue` - `VK_PRValue` instead of `VK_RValue` as default kind in lvalue and member pointer handling branch in `BuildExpressionFromNonTypeTemplateArgumentValue`; - handling of `StructuralValue` in `IsTypeDeclaredInsideVisitor`; - filling in `SugaredConverted` along with `CanonicalConverted` parameter in `Sema::CheckTemplateArgument`; - minor cleanup in `TemplateInstantiator::transformNonTypeTemplateParmRef`; - `TemplateArgument` constructors refactored; - `ODRHash` calculation for `UncommonValue`; - USR generation for `UncommonValue`; - more correct MS compatibility mangling algorithm (tested on MSVC ver. 19.35; toolset ver. 143); - IR emitting fixed on using a subobject as a template argument when the corresponding template parameter is used in an lvalue context; - `noundef` attribute and opaque pointers in `template-arguments` test; - analysis for C++17 mode is turned off for templates in `warn-bool-conversion` test; in C++17 and C++20 mode, array reference used as a template argument of pointer type produces template argument of UncommonValue type, and `BuildExpressionFromNonTypeTemplateArgumentValue` makes `OpaqueValueExpr` for it, and `DiagnoseAlwaysNonNullPointer` cannot see through it; despite of "These cases should not warn" comment, I'm not sure about correct behavior; I'd expect a suggestion to replace `if` by `if constexpr`; - `temp.arg.nontype/p1.cpp` and `dr18xx.cpp` tests fixed.
24 lines
515 B
C++
24 lines
515 B
C++
// RUN: c-index-test -test-load-source-usrs local -std=c++20 -- %s | FileCheck %s
|
|
|
|
// Check USRs of template specializations with structural NTTP values.
|
|
|
|
template <auto> struct Tpl{};
|
|
|
|
struct {
|
|
int n;
|
|
} s;
|
|
|
|
void fn1(Tpl<1.5>);
|
|
// CHECK: fn1#$@S@Tpl>#Sd[[#HASH:]]#
|
|
void fn2(Tpl<1.7>);
|
|
// CHECK-NOT: [[#HASH]]
|
|
void fn1(Tpl<1.5>) {}
|
|
// CHECK: fn1#$@S@Tpl>#Sd[[#HASH]]#
|
|
|
|
void fn(Tpl<&s.n>);
|
|
// CHECK: #S*I[[#HASH:]]#
|
|
void fn(Tpl<(void*)&s.n>);
|
|
// CHECK: #S*v[[#HASH]]#
|
|
void fn(Tpl<&s.n>) {}
|
|
// CHECK: #S*I[[#HASH]]#
|