[clang] 8de2d06 - [clang] Fix crash in bug52905

Chuanqi Xu via cfe-commits cfe-commits at lists.llvm.org
Wed Dec 29 00:22:44 PST 2021


Author: Chuanqi Xu
Date: 2021-12-29T16:22:26+08:00
New Revision: 8de2d06251c30751bdc0fd7b89133610797759e6

URL: https://github.com/llvm/llvm-project/commit/8de2d06251c30751bdc0fd7b89133610797759e6
DIFF: https://github.com/llvm/llvm-project/commit/8de2d06251c30751bdc0fd7b89133610797759e6.diff

LOG: [clang] Fix crash in bug52905

The root cause for the crash is the incorrect use of `cast`.
The actual type and cast-to type is different. This patch fixes the
crash by converting the `cast` to `dyn_cast`.

Added: 
    

Modified: 
    clang/lib/Sema/SemaOverload.cpp
    clang/test/SemaTemplate/constraints.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp
index 42b1340f9a65d..a268837b3cc86 100644
--- a/clang/lib/Sema/SemaOverload.cpp
+++ b/clang/lib/Sema/SemaOverload.cpp
@@ -14322,8 +14322,7 @@ ExprResult Sema::BuildCallToMemberFunction(Scope *S, Expr *MemExprE,
     FoundDecl = MemExpr->getFoundDecl();
     Qualifier = MemExpr->getQualifier();
     UnbridgedCasts.restore();
-  } else {
-    UnresolvedMemberExpr *UnresExpr = cast<UnresolvedMemberExpr>(NakedMemExpr);
+  } else if (auto *UnresExpr = dyn_cast<UnresolvedMemberExpr>(NakedMemExpr)) {
     Qualifier = UnresExpr->getQualifier();
 
     QualType ObjectType = UnresExpr->getBaseType();
@@ -14436,7 +14435,9 @@ ExprResult Sema::BuildCallToMemberFunction(Scope *S, Expr *MemExprE,
     }
 
     MemExpr = cast<MemberExpr>(MemExprE->IgnoreParens());
-  }
+  } else
+    // Unimaged NakedMemExpr type.
+    return ExprError();
 
   QualType ResultType = Method->getReturnType();
   ExprValueKind VK = Expr::getValueKindForType(ResultType);

diff  --git a/clang/test/SemaTemplate/constraints.cpp b/clang/test/SemaTemplate/constraints.cpp
index 0bc4727245f6a..e2bb6552fdb1c 100644
--- a/clang/test/SemaTemplate/constraints.cpp
+++ b/clang/test/SemaTemplate/constraints.cpp
@@ -24,3 +24,35 @@ namespace PR45589 {
   // FIXME: These diagnostics are excessive.
   static_assert(test<false, char> == 1); // expected-note 2{{while}} expected-note 2{{during}}
 }
+
+namespace PR52905 {
+// A mock for std::convertible_to. Not complete support.
+template <typename _From, typename _To>
+concept convertible_to = __is_convertible_to(_From, _To); // expected-note {{evaluated to false}}
+
+template <typename T>
+class A {
+public:
+  using iterator = void **;
+
+  iterator begin();
+  const iterator begin() const;
+};
+
+template <class T>
+concept Beginable1 = requires(T t) {
+  { t.begin }
+  ->convertible_to<typename T::iterator>; // expected-note {{not satisfied}}
+};
+
+static_assert(Beginable1<A<int>>); // expected-error {{static_assert failed}}
+                                   // expected-note at -1 {{does not satisfy 'Beginable1'}}
+
+template <class T>
+concept Beginable2 = requires(T t) {
+  { t.begin() }
+  ->convertible_to<typename T::iterator>;
+};
+
+static_assert(Beginable2<A<int>>);
+} // namespace PR52905


        


More information about the cfe-commits mailing list