Author: Matheus Izvekov Date: 2025-09-19T15:12:46-03:00 New Revision: bbf657d5bb52f0f60f16224aba7e05f5eb33638f
URL: https://github.com/llvm/llvm-project/commit/bbf657d5bb52f0f60f16224aba7e05f5eb33638f DIFF: https://github.com/llvm/llvm-project/commit/bbf657d5bb52f0f60f16224aba7e05f5eb33638f.diff LOG: [clang] fix expression classification for dependent binary operators (#159819) This fixes a regression reported here: https://github.com/llvm/llvm-project/pull/159463#issuecomment-3312157416 Since this regression was never released, there are no release notes. Added: Modified: clang/lib/AST/ExprClassification.cpp clang/test/SemaTemplate/temp_arg_template.cpp Removed: ################################################################################ diff --git a/clang/lib/AST/ExprClassification.cpp b/clang/lib/AST/ExprClassification.cpp index ad66335138a42..aeacd0dc765ef 100644 --- a/clang/lib/AST/ExprClassification.cpp +++ b/clang/lib/AST/ExprClassification.cpp @@ -601,6 +601,13 @@ static Cl::Kinds ClassifyMemberExpr(ASTContext &Ctx, const MemberExpr *E) { static Cl::Kinds ClassifyBinaryOp(ASTContext &Ctx, const BinaryOperator *E) { assert(Ctx.getLangOpts().CPlusPlus && "This is only relevant for C++."); + + // For binary operators which are unknown due to type dependence, the + // convention is to classify them as a prvalue. This does not matter much, but + // it needs to agree with how they are created. + if (E->getType() == Ctx.DependentTy) + return Cl::CL_PRValue; + // C++ [expr.ass]p1: All [...] return an lvalue referring to the left operand. // Except we override this for writes to ObjC properties. if (E->isAssignmentOp()) diff --git a/clang/test/SemaTemplate/temp_arg_template.cpp b/clang/test/SemaTemplate/temp_arg_template.cpp index 431e19741ece9..c9576e2057e53 100644 --- a/clang/test/SemaTemplate/temp_arg_template.cpp +++ b/clang/test/SemaTemplate/temp_arg_template.cpp @@ -149,6 +149,12 @@ namespace CheckDependentNonTypeParamTypes { }; // FIXME: This should be rejected, as there are no valid instantiations for E<char>::F template struct E<char>; + +#if __cplusplus >= 201703L + template<template<auto> class TT, class V> struct G { + using type = TT<((void)0, V::value)>; + }; +#endif } namespace PR32185 { _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
