Author: cor3ntin Date: 2023-10-03T19:38:45+02:00 New Revision: 9c1c2211693cd14b23c3899e95af1ba3129ab5db
URL: https://github.com/llvm/llvm-project/commit/9c1c2211693cd14b23c3899e95af1ba3129ab5db DIFF: https://github.com/llvm/llvm-project/commit/9c1c2211693cd14b23c3899e95af1ba3129ab5db.diff LOG: [Clang] Correctly handle callees whose type is a Record type when classifying expressions (#68078) when the callee is an object. When implementing deducing this, we changed `DeduceTemplateArgumentsFromCallArgument` to take an argument classification because we need to deduce the type of argument for which we might not have an expression yet. However classifying a dependent call expression whose type is just some sort of record or elaborated type was not supported. Fixes #68024 Added: Modified: clang/lib/AST/Expr.cpp clang/test/SemaTemplate/temp_arg_nontype_cxx1z.cpp Removed: ################################################################################ diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp index 99e89aeafc24217..4bfc4f082cd6a69 100644 --- a/clang/lib/AST/Expr.cpp +++ b/clang/lib/AST/Expr.cpp @@ -1621,6 +1621,10 @@ QualType CallExpr::getCallReturnType(const ASTContext &Ctx) const { // This should never be overloaded and so should never return null. CalleeType = Expr::findBoundMemberType(Callee); assert(!CalleeType.isNull()); + } else if (CalleeType->isRecordType()) { + // If the Callee is a record type, then it is a not-yet-resolved + // dependent call to the call operator of that type. + return Ctx.DependentTy; } else if (CalleeType->isDependentType() || CalleeType->isSpecificPlaceholderType(BuiltinType::Overload)) { return Ctx.DependentTy; diff --git a/clang/test/SemaTemplate/temp_arg_nontype_cxx1z.cpp b/clang/test/SemaTemplate/temp_arg_nontype_cxx1z.cpp index 6ab9ecbfd573b25..22788e1c1ffb3ac 100644 --- a/clang/test/SemaTemplate/temp_arg_nontype_cxx1z.cpp +++ b/clang/test/SemaTemplate/temp_arg_nontype_cxx1z.cpp @@ -603,3 +603,15 @@ namespace PR47792 { template void bar<>(); // expected-note {{previous explicit instantiation is here}} template void bar<foo>(); // expected-error {{duplicate explicit instantiation of 'bar<&PR47792::foo>'}} } + +namespace GH68024 { +template<auto> +struct s {}; + +struct { + void operator()(int); +} f; + +template<typename T> +using a = s<f(T::x)>; +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits