From 8f2342e842abcbc17c27d80b1b543848adacc2ee Mon Sep 17 00:00:00 2001 From: "Igor V. Kovalenko" Date: Tue, 14 Feb 2023 22:18:35 +0300 Subject: [PATCH] Add more C++ builtins Add __has_unique_object_representations __is_aggregate __is_assignable __is_nothrow_assignable __is_nothrow_constructible --- .../dom/ast/IASTBinaryTypeIdExpression.java | 4 ++++ .../core/dom/ast/IASTTypeIdExpression.java | 12 ++++++++++ .../ast/cpp/ICPPASTNaryTypeIdExpression.java | 4 +++- .../cpp/GPPScannerExtensionConfiguration.java | 24 +++++++++++++++---- .../eclipse/cdt/core/parser/GCCKeywords.java | 10 ++++++++ .../eclipse/cdt/core/parser/IGCCToken.java | 11 +++++++++ .../core/dom/parser/ValueFactory.java | 13 ++++++++++ .../dom/parser/cpp/GNUCPPSourceParser.java | 18 ++++++++++++++ .../cpp/semantics/EvalBinaryTypeId.java | 4 ++++ .../parser/cpp/semantics/EvalNaryTypeId.java | 1 + .../parser/cpp/semantics/EvalUnaryTypeID.java | 6 +++++ .../core/parser/scanner/CPreprocessor.java | 2 +- 12 files changed, 102 insertions(+), 7 deletions(-) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTBinaryTypeIdExpression.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTBinaryTypeIdExpression.java index 3a98edeb2ee..180fbb84660 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTBinaryTypeIdExpression.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTBinaryTypeIdExpression.java @@ -35,6 +35,10 @@ public static enum Operator { * @since 7.1 */ __is_same, + /** @since 8.1 */ + __is_assignable, + /** @since 8.1 */ + __is_nothrow_assignable, } /** diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTTypeIdExpression.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTTypeIdExpression.java index 717be98cb17..a2eafa4855e 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTTypeIdExpression.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTTypeIdExpression.java @@ -167,6 +167,18 @@ public interface IASTTypeIdExpression extends IASTExpression { */ public static final int op_is_trivially_copyable = 24; + /** + * Built-in type trait of g++. + * @since 8.1 + */ + public static final int op_has_unique_object_representations = 25; + + /** + * Built-in type trait of g++. + * @since 8.1 + */ + public static final int op_is_aggregate = 26; + /** * Returns the operator for the expression. * diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTNaryTypeIdExpression.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTNaryTypeIdExpression.java index ca0bfa2c6f8..d6beab1800a 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTNaryTypeIdExpression.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTNaryTypeIdExpression.java @@ -30,7 +30,9 @@ public interface ICPPASTNaryTypeIdExpression extends ICPPASTExpression { public static enum Operator { __is_trivially_constructible, /** @since 6.6 */ - __is_constructible + __is_constructible, + /** @since 8.1 */ + __is_nothrow_constructible, } /** diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/parser/cpp/GPPScannerExtensionConfiguration.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/parser/cpp/GPPScannerExtensionConfiguration.java index 08c71bf393a..327bc2d9e2a 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/parser/cpp/GPPScannerExtensionConfiguration.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/parser/cpp/GPPScannerExtensionConfiguration.java @@ -43,6 +43,7 @@ private static enum CompilerType { private static final int VERSION_6_0 = version(6, 0); private static final int VERSION_8_0 = version(8, 0); private static final int VERSION_10_0 = version(10, 0); + private static final int VERSION_11_1 = version(11, 1); private static GPPScannerExtensionConfiguration CONFIG = new GPPScannerExtensionConfiguration(); private static GPPScannerExtensionConfiguration CONFIG_4_2 = new GPPScannerExtensionConfiguration(VERSION_4_2); private static GPPScannerExtensionConfiguration CONFIG_4_3 = new GPPScannerExtensionConfiguration(VERSION_4_3); @@ -52,6 +53,7 @@ private static enum CompilerType { private static GPPScannerExtensionConfiguration CONFIG_6_0 = new GPPScannerExtensionConfiguration(VERSION_6_0); private static GPPScannerExtensionConfiguration CONFIG_8_0 = new GPPScannerExtensionConfiguration(VERSION_8_0); private static GPPScannerExtensionConfiguration CONFIG_10_0 = new GPPScannerExtensionConfiguration(VERSION_10_0); + private static GPPScannerExtensionConfiguration CONFIG_11_1 = new GPPScannerExtensionConfiguration(VERSION_11_1); private static GPPScannerExtensionConfiguration CONFIG_CLANG = new GPPScannerExtensionConfiguration( CompilerType.Clang, 0 /* version is ignored for now */); private static GPPScannerExtensionConfiguration CONFIG_CLANG_CL = new GPPScannerExtensionConfiguration( @@ -89,6 +91,9 @@ public static GPPScannerExtensionConfiguration getInstance(IScannerInfo info) { int major = Integer.valueOf(definedSymbols.get("__GNUC__")); //$NON-NLS-1$ int minor = Integer.valueOf(definedSymbols.get("__GNUC_MINOR__")); //$NON-NLS-1$ int version = version(major, minor); + if (version >= VERSION_11_1) { + return CONFIG_11_1; + } if (version >= VERSION_10_0) { return CONFIG_10_0; } @@ -192,12 +197,20 @@ public GPPScannerExtensionConfiguration(CompilerType compiler, int version) { addKeyword(GCCKeywords.cp__is_same_as, IGCCToken.tTT_is_same); } if (version >= VERSION_8_0) { + addKeyword(GCCKeywords.cp__has_unique_object_representations, + IGCCToken.tTT_has_unique_object_representations); + addKeyword(GCCKeywords.cp__is_aggregate, IGCCToken.tTT_is_aggregate); + addKeyword(GCCKeywords.cp__is_assignable, IGCCToken.tTT_is_assignable); addKeyword(GCCKeywords.cp__is_constructible, IGCCToken.tTT_is_constructible); addKeyword(GCCKeywords.cp__integer_pack, IGCCToken.tTT_integer_pack); } if (version >= VERSION_10_0) { addKeyword(GCCKeywords.cp__is_same, IGCCToken.tTT_is_same); } + if (version >= VERSION_11_1) { + addKeyword(GCCKeywords.cp__is_nothrow_assignable, IGCCToken.tTT_is_nothrow_assignable); + addKeyword(GCCKeywords.cp__is_nothrow_constructible, IGCCToken.tTT_is_nothrow_constructible); + } } else if (compiler == CompilerType.Clang || compiler == CompilerType.ClangCl) { // As documented at // http://clang.llvm.org/docs/LanguageExtensions.html#checks-for-type-trait-primitives. @@ -212,13 +225,14 @@ public GPPScannerExtensionConfiguration(CompilerType compiler, int version) { addKeyword(GCCKeywords.cp__has_trivial_copy, IGCCToken.tTT_has_trivial_copy); addKeyword(GCCKeywords.cp__has_trivial_constructor, IGCCToken.tTT_has_trivial_constructor); addKeyword(GCCKeywords.cp__has_trivial_destructor, IGCCToken.tTT_has_trivial_destructor); - // __has_unique_object_representations + addKeyword(GCCKeywords.cp__has_unique_object_representations, + IGCCToken.tTT_has_unique_object_representations); addKeyword(GCCKeywords.cp__has_virtual_destructor, IGCCToken.tTT_has_virtual_destructor); addKeyword(GCCKeywords.cp__is_abstract, IGCCToken.tTT_is_abstract); - // __is_aggregate + addKeyword(GCCKeywords.cp__is_aggregate, IGCCToken.tTT_is_aggregate); // __is_arithmetic // __is_array - // __is_assignable + addKeyword(GCCKeywords.cp__is_assignable, IGCCToken.tTT_is_assignable); addKeyword(GCCKeywords.cp__is_base_of, IGCCToken.tTT_is_base_of); addKeyword(GCCKeywords.cp__is_class, IGCCToken.tTT_is_class); // __is_complete_type @@ -242,8 +256,8 @@ public GPPScannerExtensionConfiguration(CompilerType compiler, int version) { // __is_member_object_pointer // __is_member_function_pointer // __is_member_pointer - // __is_nothrow_assignable - // __is_nothrow_constructible + addKeyword(GCCKeywords.cp__is_nothrow_assignable, IGCCToken.tTT_is_nothrow_assignable); + addKeyword(GCCKeywords.cp__is_nothrow_constructible, IGCCToken.tTT_is_nothrow_constructible); // __is_nothrow_destructible // __is_object addKeyword(GCCKeywords.cp__is_pod, IGCCToken.tTT_is_pod); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/GCCKeywords.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/GCCKeywords.java index b7374946fce..be9b7e60b11 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/GCCKeywords.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/GCCKeywords.java @@ -104,4 +104,14 @@ public class GCCKeywords { * @since 7.1 */ public static final char[] cp__is_same = "__is_same".toCharArray(), cp__is_same_as = "__is_same_as".toCharArray(); + + /** @since 8.1 */ + public static final char[] cp__has_unique_object_representations = "__has_unique_object_representations" + .toCharArray(); + + /** @since 8.1 */ + public static final char[] cp__is_aggregate = "__is_aggregate".toCharArray(), + cp__is_assignable = "__is_assignable".toCharArray(), + cp__is_nothrow_assignable = "__is_nothrow_assignable".toCharArray(), + cp__is_nothrow_constructible = "__is_nothrow_constructible".toCharArray(); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/IGCCToken.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/IGCCToken.java index 61dd350c9e6..d26f82e983b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/IGCCToken.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/IGCCToken.java @@ -101,4 +101,15 @@ public interface IGCCToken extends IToken { * @since 7.1 */ int tTT_is_same = FIRST_RESERVED_IGCCToken + 37; + + /** @since 8.1 */ + int tTT_is_aggregate = FIRST_RESERVED_IGCCToken + 38; + /** @since 8.1 */ + int tTT_is_assignable = FIRST_RESERVED_IGCCToken + 39; + /** @since 8.1 */ + int tTT_is_nothrow_assignable = FIRST_RESERVED_IGCCToken + 40; + /** @since 8.1 */ + int tTT_is_nothrow_constructible = FIRST_RESERVED_IGCCToken + 41; + /** @since 8.1 */ + int tTT_has_unique_object_representations = FIRST_RESERVED_IGCCToken + 42; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ValueFactory.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ValueFactory.java index b9585e5f510..aa582d5ed8f 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ValueFactory.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ValueFactory.java @@ -22,8 +22,10 @@ import static org.eclipse.cdt.core.dom.ast.IASTTypeIdExpression.op_has_trivial_constructor; import static org.eclipse.cdt.core.dom.ast.IASTTypeIdExpression.op_has_trivial_copy; import static org.eclipse.cdt.core.dom.ast.IASTTypeIdExpression.op_has_trivial_destructor; +import static org.eclipse.cdt.core.dom.ast.IASTTypeIdExpression.op_has_unique_object_representations; import static org.eclipse.cdt.core.dom.ast.IASTTypeIdExpression.op_has_virtual_destructor; import static org.eclipse.cdt.core.dom.ast.IASTTypeIdExpression.op_is_abstract; +import static org.eclipse.cdt.core.dom.ast.IASTTypeIdExpression.op_is_aggregate; import static org.eclipse.cdt.core.dom.ast.IASTTypeIdExpression.op_is_class; import static org.eclipse.cdt.core.dom.ast.IASTTypeIdExpression.op_is_empty; import static org.eclipse.cdt.core.dom.ast.IASTTypeIdExpression.op_is_enum; @@ -445,11 +447,16 @@ private static IValue applyUnaryTypeIdOperator(int operator, IType type) { !(type instanceof ICPPClassType) || TypeTraits.hasTrivialCopyCtor((ICPPClassType) type) ? 1 : 0); case op_has_trivial_destructor: break; // TODO(sprigogin): Implement + case op_has_unique_object_representations: + break; // TODO: Implement case op_has_virtual_destructor: break; // TODO(sprigogin): Implement case op_is_abstract: return IntegralValue .create(type instanceof ICPPClassType && TypeTraits.isAbstract((ICPPClassType) type) ? 1 : 0); + case op_is_aggregate: + return IntegralValue + .create(type instanceof ICPPClassType && TypeTraits.isAggregateClass((ICPPClassType) type) ? 1 : 0); case op_is_class: return IntegralValue.create( type instanceof ICompositeType && ((ICompositeType) type).getKey() != ICompositeType.k_union ? 1 @@ -629,6 +636,10 @@ private static IValue applyBinaryTypeIdOperator(IASTBinaryTypeIdExpression.Opera return IntegralValue.create(1); } return IntegralValue.create(0); + case __is_assignable: + return IntegralValue.UNKNOWN; // TODO: Implement. + case __is_nothrow_assignable: + return IntegralValue.UNKNOWN; // TODO: Implement. case __is_same: if (type1.isSameType(type2)) { return IntegralValue.create(1); @@ -654,6 +665,8 @@ private static IValue applyNaryTypeIdOperator(ICPPASTNaryTypeIdExpression.Operat return IntegralValue.create( TypeTraits.isConstructible(typeToConstruct, argumentTypes, pointOfDefinition, checkTrivial) ? 1 : 0); + case __is_nothrow_constructible: + return IntegralValue.UNKNOWN; // TODO: Implement } return IntegralValue.UNKNOWN; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java index d6ccfeaccc0..c417ea55dcc 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java @@ -1789,8 +1789,10 @@ protected IASTExpression unaryExpression(CastExprCtx ctx, ITemplateIdStrategy st case IGCCToken.tTT_has_trivial_constructor: case IGCCToken.tTT_has_trivial_copy: case IGCCToken.tTT_has_trivial_destructor: + case IGCCToken.tTT_has_unique_object_representations: case IGCCToken.tTT_has_virtual_destructor: case IGCCToken.tTT_is_abstract: + case IGCCToken.tTT_is_aggregate: case IGCCToken.tTT_is_base_of: case IGCCToken.tTT_is_class: case IGCCToken.tTT_is_empty: @@ -1807,6 +1809,9 @@ protected IASTExpression unaryExpression(CastExprCtx ctx, ITemplateIdStrategy st case IGCCToken.tTT_is_trivially_assignable: case IGCCToken.tTT_is_constructible: case IGCCToken.tTT_is_same: + case IGCCToken.tTT_is_assignable: + case IGCCToken.tTT_is_nothrow_assignable: + case IGCCToken.tTT_is_nothrow_constructible: return parseTypeTrait(); default: @@ -1857,6 +1862,8 @@ private IASTExpression parseTypeTrait() throws EndOfFileException, BacktrackExce private boolean isBinaryTrait(IToken first) { switch (first.getType()) { case IGCCToken.tTT_is_base_of: + case IGCCToken.tTT_is_assignable: + case IGCCToken.tTT_is_nothrow_assignable: case IGCCToken.tTT_is_trivially_assignable: case IGCCToken.tTT_is_same: return true; @@ -1868,6 +1875,7 @@ private boolean isNaryTrait(IToken operatorToken) { switch (operatorToken.getType()) { case IGCCToken.tTT_is_trivially_constructible: case IGCCToken.tTT_is_constructible: + case IGCCToken.tTT_is_nothrow_constructible: return true; } return false; @@ -1877,6 +1885,10 @@ private IASTBinaryTypeIdExpression.Operator getBinaryTypeTraitOperator(IToken fi switch (first.getType()) { case IGCCToken.tTT_is_base_of: return IASTBinaryTypeIdExpression.Operator.__is_base_of; + case IGCCToken.tTT_is_assignable: + return IASTBinaryTypeIdExpression.Operator.__is_assignable; + case IGCCToken.tTT_is_nothrow_assignable: + return IASTBinaryTypeIdExpression.Operator.__is_nothrow_assignable; case IGCCToken.tTT_is_trivially_assignable: return IASTBinaryTypeIdExpression.Operator.__is_trivially_assignable; case IGCCToken.tTT_is_same: @@ -1893,6 +1905,8 @@ private ICPPASTNaryTypeIdExpression.Operator getNaryTypeTraitOperator(IToken ope return ICPPASTNaryTypeIdExpression.Operator.__is_trivially_constructible; case IGCCToken.tTT_is_constructible: return ICPPASTNaryTypeIdExpression.Operator.__is_constructible; + case IGCCToken.tTT_is_nothrow_constructible: + return ICPPASTNaryTypeIdExpression.Operator.__is_nothrow_constructible; } assert false; @@ -1915,10 +1929,14 @@ private int getUnaryTypeTraitOperator(IToken first) { return IASTTypeIdExpression.op_has_trivial_copy; case IGCCToken.tTT_has_trivial_destructor: return IASTTypeIdExpression.op_has_trivial_destructor; + case IGCCToken.tTT_has_unique_object_representations: + return IASTTypeIdExpression.op_has_unique_object_representations; case IGCCToken.tTT_has_virtual_destructor: return IASTTypeIdExpression.op_has_virtual_destructor; case IGCCToken.tTT_is_abstract: return IASTTypeIdExpression.op_is_abstract; + case IGCCToken.tTT_is_aggregate: + return IASTTypeIdExpression.op_is_aggregate; case IGCCToken.tTT_is_class: return IASTTypeIdExpression.op_is_class; case IGCCToken.tTT_is_empty: diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalBinaryTypeId.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalBinaryTypeId.java index dc0d2369b94..e547419e354 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalBinaryTypeId.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalBinaryTypeId.java @@ -79,9 +79,13 @@ public boolean isFunctionSet() { public IType getType() { switch (fOperator) { case __is_base_of: + case __is_assignable: + case __is_nothrow_assignable: case __is_trivially_assignable: case __is_same: return CPPBasicType.BOOLEAN; + default: + break; } return ProblemType.UNKNOWN_FOR_EXPRESSION; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalNaryTypeId.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalNaryTypeId.java index 0b8a0c8bc4a..6ae28788544 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalNaryTypeId.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalNaryTypeId.java @@ -101,6 +101,7 @@ public IType getType() { switch (fOperator) { case __is_trivially_constructible: case __is_constructible: + case __is_nothrow_constructible: return CPPBasicType.BOOLEAN; } return ProblemType.UNKNOWN_FOR_EXPRESSION; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalUnaryTypeID.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalUnaryTypeID.java index 5d8348e5ab8..807292b5efc 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalUnaryTypeID.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalUnaryTypeID.java @@ -23,8 +23,10 @@ import static org.eclipse.cdt.core.dom.ast.IASTTypeIdExpression.op_has_trivial_constructor; import static org.eclipse.cdt.core.dom.ast.IASTTypeIdExpression.op_has_trivial_copy; import static org.eclipse.cdt.core.dom.ast.IASTTypeIdExpression.op_has_trivial_destructor; +import static org.eclipse.cdt.core.dom.ast.IASTTypeIdExpression.op_has_unique_object_representations; import static org.eclipse.cdt.core.dom.ast.IASTTypeIdExpression.op_has_virtual_destructor; import static org.eclipse.cdt.core.dom.ast.IASTTypeIdExpression.op_is_abstract; +import static org.eclipse.cdt.core.dom.ast.IASTTypeIdExpression.op_is_aggregate; import static org.eclipse.cdt.core.dom.ast.IASTTypeIdExpression.op_is_class; import static org.eclipse.cdt.core.dom.ast.IASTTypeIdExpression.op_is_empty; import static org.eclipse.cdt.core.dom.ast.IASTTypeIdExpression.op_is_enum; @@ -112,8 +114,10 @@ public boolean isValueDependent() { case op_has_trivial_constructor: case op_has_trivial_copy: case op_has_trivial_destructor: + case op_has_unique_object_representations: case op_has_virtual_destructor: case op_is_abstract: + case op_is_aggregate: case op_is_class: case op_is_empty: case op_is_enum: @@ -173,8 +177,10 @@ private IType computeType() { case op_has_trivial_constructor: case op_has_trivial_copy: case op_has_trivial_destructor: + case op_has_unique_object_representations: case op_has_virtual_destructor: case op_is_abstract: + case op_is_aggregate: case op_is_class: case op_is_empty: case op_is_enum: diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/CPreprocessor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/CPreprocessor.java index efd581d5661..82c03562241 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/CPreprocessor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/CPreprocessor.java @@ -2352,7 +2352,7 @@ public Set getSupportedFeatures() { // missing: is_interface_class // missing: is_literal // missing: is_nothrow_assignable - // missing: is_nothrow_constructible + addTypeTraitPrimitive("is_nothrow_constructible", GCCKeywords.cp__is_nothrow_constructible); // missing: is_nothrow_destructible addTypeTraitPrimitive("is_pod", GCCKeywords.cp__is_pod); addTypeTraitPrimitive("is_polymorphic", GCCKeywords.cp__is_polymorphic);