From 3fdea6e31ac6ad3e617df872d79e60d77f79b0f0 Mon Sep 17 00:00:00 2001 From: "Igor V. Kovalenko" Date: Fri, 24 Mar 2023 23:27:48 +0300 Subject: [PATCH] Allow binary operator templates --- .../cdt/core/parser/tests/ast2/AST2CPPTests.java | 16 ++++++++++++++++ .../dom/parser/cpp/semantics/CPPSemantics.java | 7 ++++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java index a0883238103..49726e69581 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java @@ -4221,6 +4221,22 @@ public class AST2CPPTests extends AST2CPPTestBase { helper.assertVariableValue("greater10", 1); } + // template + // constexpr int operator |(T1 t1, T2 t2) { + // return t1 + t2; + // } + // + // enum X { + // V1 = 17, + // V2 = 25, + // }; + // + // constexpr auto value = V1 | V2; + public void testBinaryOperatorOverloadTemplate() throws Exception { + BindingAssertionHelper helper = getAssertionHelper(CPP); + helper.assertVariableValue("value", 42); + } + // typedef int I; // typedef int I; // typedef I I; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java index 85325aea5e4..03f123ac855 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java @@ -4099,9 +4099,10 @@ public class CPPSemantics { ICPPFunctionType ft = func.getType(); IType[] pts = ft.getParameterTypes(); if ((enum1 != null && pts.length > 0 - && enum1.isSameType(getUltimateTypeUptoPointers(pts[0]))) - || (enum2 != null && pts.length > 1 - && enum2.isSameType(getUltimateTypeUptoPointers(pts[1])))) { + && (CPPTemplates.isDependentType(pts[0]) + || enum1.isSameType(getUltimateTypeUptoPointers(pts[0])))) + || (enum2 != null && pts.length > 1 && (CPPTemplates.isDependentType(pts[1]) + || enum2.isSameType(getUltimateTypeUptoPointers(pts[1]))))) { items[j++] = object; } }