llvmbot wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: Rose Hudson (rosefromthedead)

<details>
<summary>Changes</summary>

It was assumed that since this is a method on Type, there are no quals present 
because usually you get a Type by using operator-&gt; on a QualType. However, 
quals aren't always stored in the outermost QualType. For example, if const A 
is used as a template parameter, the outer QualType does not have the const 
flag set. The const actually lives in the canonical type inside a 
SubstTemplateTypeParmType. We therefore need to explicitly remove quals before 
returning.

Fixes #<!-- -->135273

---

I've been looking at all the call sites as suggested in 
https://github.com/llvm/llvm-project/pull/167881#discussion_r2535247632 to 
check that their usage of this method is sane. So far, most of the sites seem 
to either want unqualified types or not care, so this patch should handle some 
spooky edge cases of those. Some of them need more thinking, which I'll do soon.

Supersedes #<!-- -->167881

---
Full diff: https://github.com/llvm/llvm-project/pull/170271.diff


3 Files Affected:

- (modified) clang/docs/ReleaseNotes.rst (+1) 
- (modified) clang/include/clang/AST/CanonicalType.h (+2-1) 
- (modified) clang/test/SemaCXX/type-traits.cpp (+10) 


``````````diff
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index da064534c25d9..0aa899817f3ea 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -567,6 +567,7 @@ Bug Fixes to C++ Support
 - Fix a crash when extracting unavailable member type from alias in template 
deduction. (#GH165560)
 - Fix incorrect diagnostics for lambdas with init-captures inside braced 
initializers. (#GH163498)
 - Fixed spurious diagnoses of certain nested lambda expressions. (#GH149121) 
(#GH156579)
+- Fix the result of ``__is_pointer_interconvertible_base_of`` when arguments 
are qualified and passed via template parameters. (#GH135273)
 
 Bug Fixes to AST Handling
 ^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/clang/include/clang/AST/CanonicalType.h 
b/clang/include/clang/AST/CanonicalType.h
index 87bbd7b5d885d..b46fc8f50fa23 100644
--- a/clang/include/clang/AST/CanonicalType.h
+++ b/clang/include/clang/AST/CanonicalType.h
@@ -213,7 +213,8 @@ inline bool operator!=(CanQual<T> x, CanQual<U> y) {
 using CanQualType = CanQual<Type>;
 
 inline CanQualType Type::getCanonicalTypeUnqualified() const {
-  return CanQualType::CreateUnsafe(getCanonicalTypeInternal());
+  return CanQualType::CreateUnsafe(
+      getCanonicalTypeInternal().getUnqualifiedType());
 }
 
 inline const StreamingDiagnostic &operator<<(const StreamingDiagnostic &DB,
diff --git a/clang/test/SemaCXX/type-traits.cpp 
b/clang/test/SemaCXX/type-traits.cpp
index 9ef44d0346b48..561c9ca8286b9 100644
--- a/clang/test/SemaCXX/type-traits.cpp
+++ b/clang/test/SemaCXX/type-traits.cpp
@@ -1812,6 +1812,11 @@ union Union {};
 union UnionIncomplete;
 struct StructIncomplete; // #StructIncomplete
 
+#if __cplusplus >= 201402L
+template<class _Base, class _Derived>
+inline constexpr bool IsPointerInterconvertibleBaseOfV = 
__is_pointer_interconvertible_base_of(_Base, _Derived);
+#endif
+
 void is_pointer_interconvertible_base_of(int n)
 {
   static_assert(__is_pointer_interconvertible_base_of(Base, Derived));
@@ -1880,6 +1885,11 @@ void is_pointer_interconvertible_base_of(int n)
   static_assert(!__is_pointer_interconvertible_base_of(void(&)(int), 
void(&)(char)));
   static_assert(!__is_pointer_interconvertible_base_of(void(*)(int), 
void(*)(int)));
   static_assert(!__is_pointer_interconvertible_base_of(void(*)(int), 
void(*)(char)));
+
+#if __cplusplus >= 201402L
+  static_assert(IsPointerInterconvertibleBaseOfV<const Base, Base>);
+  static_assert(IsPointerInterconvertibleBaseOfV<const Base, Derived>);
+#endif
 }
 }
 

``````````

</details>


https://github.com/llvm/llvm-project/pull/170271
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to