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

Reply via email to