[clang] 6bcef54 - Ensure we disambiguate NTTP names when doing TemplateTree comparisons

via cfe-commits cfe-commits at lists.llvm.org
Thu Sep 21 13:28:11 PDT 2023


Author: erichkeane
Date: 2023-09-21T13:28:04-07:00
New Revision: 6bcef543e3a31da26b0164ba4ed6e79e8f0a72c3

URL: https://github.com/llvm/llvm-project/commit/6bcef543e3a31da26b0164ba4ed6e79e8f0a72c3
DIFF: https://github.com/llvm/llvm-project/commit/6bcef543e3a31da26b0164ba4ed6e79e8f0a72c3.diff

LOG: Ensure we disambiguate NTTP names when doing TemplateTree comparisons

835b99e4c did this when we printed the NTTPs while NOT doing a
TemplateTree comparison, this does the same change for the TemplateTree
mechanism as well, amking the diagnostics less confusing in these cases.

Fixes: #66744

Added: 
    clang/test/AST/ast-nttp-template-tree-compares.cpp

Modified: 
    clang/docs/ReleaseNotes.rst
    clang/lib/AST/ASTDiagnostic.cpp
    clang/test/SemaCXX/cxx2a-nttp-printing.cpp

Removed: 
    


################################################################################
diff  --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 77aad0c9731bea1..477a40630f11097 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -335,6 +335,10 @@ Bug Fixes to C++ Support
 - Clang now no longer asserts when an UnresolvedLookupExpr is used as an
   expression requirement. (`#66612 https://github.com/llvm/llvm-project/issues/66612`)
 
+- Clang now disambiguates NTTP types when printing diagnostics where the
+  NTTP types are compared with the '
diff ' method.
+  (`#66744 https://github.com/llvm/llvm-project/issues/66744`)
+
 Bug Fixes to AST Handling
 ^^^^^^^^^^^^^^^^^^^^^^^^^
 - Fixed an import failure of recursive friend class template.

diff  --git a/clang/lib/AST/ASTDiagnostic.cpp b/clang/lib/AST/ASTDiagnostic.cpp
index f96a4fa3c35b0f9..7b0d5f9cc1a93d5 100644
--- a/clang/lib/AST/ASTDiagnostic.cpp
+++ b/clang/lib/AST/ASTDiagnostic.cpp
@@ -1890,6 +1890,7 @@ class TemplateDiff {
         // FIXME: Diffing the APValue would be neat.
         // FIXME: Suppress this and use the full name of the declaration if the
         // parameter is a pointer or reference.
+        TPO->getType().getUnqualifiedType().print(OS, Policy);
         TPO->printAsInit(OS, Policy);
         return;
       }

diff  --git a/clang/test/AST/ast-nttp-template-tree-compares.cpp b/clang/test/AST/ast-nttp-template-tree-compares.cpp
new file mode 100644
index 000000000000000..a767e385b8f0abc
--- /dev/null
+++ b/clang/test/AST/ast-nttp-template-tree-compares.cpp
@@ -0,0 +1,16 @@
+// RUN: %clang_cc1 -std=c++20 -verify %s -o -
+
+struct empty {};
+struct metre : empty { };
+struct second : empty { };
+template<auto, auto> struct divided_units : empty { };
+template<auto> struct quantity { }; // #QUANT
+
+void use() {
+  quantity<divided_units<metre{}, second{}>{}> q{};
+  quantity<metre{}> q2 = q;
+  // expected-error at -1 {{no viable conversion from 'quantity<divided_units<metre{}, second{}>{{}}>' to 'quantity<metre{{}}>'}}
+  // expected-note@#QUANT {{candidate constructor (the implicit copy constructor) not viable: no known conversion from 'quantity<divided_units<metre{}, second{}>{}>' to 'const quantity<metre{{}}> &' for 1st argument}}
+  // expected-note@#QUANT {{candidate constructor (the implicit move constructor) not viable: no known conversion from 'quantity<divided_units<metre{}, second{}>{}>' to 'quantity<metre{{}}> &&' for 1st argument}}
+}
+

diff  --git a/clang/test/SemaCXX/cxx2a-nttp-printing.cpp b/clang/test/SemaCXX/cxx2a-nttp-printing.cpp
index f535404dc69c47c..d03a5dd7dd6ad58 100644
--- a/clang/test/SemaCXX/cxx2a-nttp-printing.cpp
+++ b/clang/test/SemaCXX/cxx2a-nttp-printing.cpp
@@ -7,9 +7,9 @@ template <int N> struct Str {
 
 template <Str V> class ASCII {};
 
-void Foo(ASCII<"this nontype template argument is too long to print">); // expected-note {{no known conversion from 'ASCII<{"this nontype template argument is too long"}>' to 'ASCII<{"this nontype template argument is too long to print"}>'}}
-void Bar(ASCII<"this nttp argument is too short">);                     // expected-note {{no known conversion from 'ASCII<{{119, 97, 105, 116, 32, 97, 32, 115, 27, 99, 111, 110, 100, 0}}>' to 'ASCII<{"this nttp argument is too short"}>'}}
-void Meow(ASCII<"what|">);                                              // expected-note {{no known conversion from 'ASCII<{"what??!"}>' to 'ASCII<{"what|"}>' for 1st argument}}
+void Foo(ASCII<"this nontype template argument is too long to print">); // expected-note {{no known conversion from 'ASCII<Str<43>{"this nontype template argument is too long"}>' to 'ASCII<Str<52>{"this nontype template argument is too long to print"}>'}}
+void Bar(ASCII<"this nttp argument is too short">);                     // expected-note {{no known conversion from 'ASCII<Str<14>{{119, 97, 105, 116, 32, 97, 32, 115, 27, 99, 111, 110, 100, 0}}>' to 'ASCII<Str<32>{"this nttp argument is too short"}>'}}
+void Meow(ASCII<"what|">);                                              // expected-note {{no known conversion from 'ASCII<Str<8>{"what??!"}>' to 'ASCII<Str<6>{"what|"}>' for 1st argument}}
 
 void test_ascii() {
   ASCII<"this nontype template argument"


        


More information about the cfe-commits mailing list