[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
[cdt-patch] Fixed 79810 - 'invalid arithmetic conversion' on line 0
|
Fixed 79810 - 'invalid arithmetic conversion'
on line 0
This also clears up the last IProblem
related to https://bugs.eclipse.org/bugs/show_bug.cgi?id=75403
Devin Steffler
IBM's Eclipse CDT
Ottawa (Palladium), Ontario, Canada
Index: parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt-core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java,v
retrieving revision 1.142
diff -u -r1.142 CompleteParseASTTest.java
--- parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java 30 Nov 2004 18:51:47 -0000 1.142
+++ parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java 1 Dec 2004 16:47:38 -0000
@@ -2514,5 +2514,23 @@
}
}
+ public void testBug79810A() throws Exception {
+ Writer writer = new StringWriter();
+ writer.write("void foo() {\n"); //$NON-NLS-1$
+ writer.write("int test;\n"); //$NON-NLS-1$
+ writer.write("if ((__extension__ ({ union { int __in; int __i; } __u; __u.__in = (test); __u.__i; })) & 0x7f) {}\n}\n"); //$NON-NLS-1$
+ parse(writer.toString());
+
+ writer = new StringWriter();
+ writer.write("#define __WTERMSIG(status) ((status) & 0x7f)\n"); //$NON-NLS-1$
+ writer.write("#define __WIFEXITED(status) (__WTERMSIG(status) == 0)\n"); //$NON-NLS-1$
+ writer.write("#define __WAIT_INT(status) (__extension__ ({ union { int __in; int __i; } __u; \\\n"); //$NON-NLS-1$
+ writer.write(" __u.__in = (test); __u.__i; }))\n"); //$NON-NLS-1$
+ writer.write("#define WIFEXITED(status) __WIFEXITED(__WAIT_INT(status))\n"); //$NON-NLS-1$
+ writer.write("void foo() {\n"); //$NON-NLS-1$
+ writer.write("int test;\n"); //$NON-NLS-1$
+ writer.write("if (WIFEXITED(test)) {}\n}\n"); //$NON-NLS-1$
+ parse(writer.toString());
+ }
}
Index: parser/org/eclipse/cdt/core/parser/tests/CompleteParsePluginTest.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt-core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParsePluginTest.java,v
retrieving revision 1.9
diff -u -r1.9 CompleteParsePluginTest.java
--- parser/org/eclipse/cdt/core/parser/tests/CompleteParsePluginTest.java 29 Nov 2004 21:00:26 -0000 1.9
+++ parser/org/eclipse/cdt/core/parser/tests/CompleteParsePluginTest.java 1 Dec 2004 16:47:38 -0000
@@ -222,4 +222,53 @@
assertEquals(foo.getName(), "foo"); //$NON-NLS-1$
assertTrue(new String(foo.getFilename()).indexOf("header.h") > 0); //$NON-NLS-1$
}
+
+ public void testBug79810B() throws Exception {
+ Writer writer = new StringWriter();
+ writer.write("#define __WTERMSIG(status) ((status) & 0x7f)\n"); //$NON-NLS-1$
+ writer.write("#define __WIFEXITED(status) (__WTERMSIG(status) == 0)\n"); //$NON-NLS-1$
+ writer.write("#define __WAIT_INT(status) (__extension__ ({ union { int __in; int __i; } __u; \\\n"); //$NON-NLS-1$
+ writer.write(" __u.__in = (test); __u.__i; }))\n"); //$NON-NLS-1$
+ writer.write("#define WIFEXITED(status) __WIFEXITED(__WAIT_INT(status))\n"); //$NON-NLS-1$
+ importFile( "header.h", writer.toString() ); //$NON-NLS-1$
+
+ writer = new StringWriter();
+ writer.write( "#include \"header.h\" \n"); //$NON-NLS-1$
+ writer.write("void foo() {\n"); //$NON-NLS-1$
+ writer.write("int test;\n"); //$NON-NLS-1$
+ writer.write("if (WIFEXITED(test)) {}\n}\n"); //$NON-NLS-1$
+ IFile cpp = importFile( "test.cpp", writer.toString() ); //$NON-NLS-1$
+
+ List calls = new ArrayList();
+ parse( cpp, calls );
+
+ Iterator i = calls.iterator();
+
+ assertEquals( i.next(), CallbackTracker.ENTER_COMPILATION_UNIT );
+ assertEquals( i.next(), CallbackTracker.ENTER_INCLUSION );
+ assertEquals( i.next(), CallbackTracker.ACCEPT_MACRO );
+ assertEquals( i.next(), CallbackTracker.ACCEPT_MACRO );
+ assertEquals( i.next(), CallbackTracker.ACCEPT_MACRO );
+ assertEquals( i.next(), CallbackTracker.ACCEPT_MACRO );
+ assertEquals( i.next(), CallbackTracker.EXIT_INCLUSION );
+ assertEquals( i.next(), CallbackTracker.ENTER_FUNCTION );
+ assertEquals( i.next(), CallbackTracker.ACCEPT_VARIABLE );
+ assertEquals( i.next(), CallbackTracker.ENTER_CODE_BLOCK );
+ assertEquals( i.next(), CallbackTracker.ENTER_CLASS_SPEC );
+ assertEquals( i.next(), CallbackTracker.ACCEPT_FIELD );
+ assertEquals( i.next(), CallbackTracker.ACCEPT_FIELD );
+ assertEquals( i.next(), CallbackTracker.EXIT_CLASS );
+ assertEquals( i.next(), CallbackTracker.ACCEPT_VARIABLE );
+ assertEquals( i.next(), CallbackTracker.ACCEPT_REFERENCE );
+ assertEquals( i.next(), CallbackTracker.ACCEPT_REFERENCE );
+ assertEquals( i.next(), CallbackTracker.ACCEPT_REFERENCE );
+ assertEquals( i.next(), CallbackTracker.ACCEPT_REFERENCE );
+ assertEquals( i.next(), CallbackTracker.ACCEPT_REFERENCE );
+ assertEquals( i.next(), CallbackTracker.EXIT_CODE_BLOCK );
+ assertEquals( i.next(), CallbackTracker.ENTER_CODE_BLOCK );
+ assertEquals( i.next(), CallbackTracker.EXIT_CODE_BLOCK );
+ assertEquals( i.next(), CallbackTracker.EXIT_FUNCTION );
+ assertEquals( i.next(), CallbackTracker.EXIT_COMPILATION_UNIT );
+ assertFalse( i.hasNext() );
+ }
}
Index: parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java,v
retrieving revision 1.201
diff -u -r1.201 CompleteParseASTFactory.java
--- parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java 29 Nov 2004 21:00:32 -0000 1.201
+++ parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java 1 Dec 2004 18:08:11 -0000
@@ -1391,6 +1391,21 @@
rhs = rhs.getTypeSymbol().getTypeInfo();
}
+ boolean checkInvalidConversion = true;
+ IASTExpression expLeftTest = lhsExp.getLHSExpression();
+ IASTExpression expRightTest = rhsExp.getLHSExpression();
+ while (expLeftTest != null && !(expLeftTest instanceof ASTEmptyExpression)) {
+ expLeftTest = expLeftTest.getLHSExpression();
+ }
+
+ while (expRightTest != null && !(expRightTest instanceof ASTEmptyExpression)) {
+ expRightTest = expRightTest.getLHSExpression();
+ }
+
+ if ((expLeftTest != null && expLeftTest instanceof ASTEmptyExpression) || (expRightTest != null && expRightTest instanceof ASTEmptyExpression))
+ checkInvalidConversion = false;
+
+ if (checkInvalidConversion) {
// invalid arithmetic detection TODO add support for 4.5 Integral Promotions/4.7 Integral Conversions if necessary
// 5.6 Multiplicative Operators: The operands of * and / shall have arithmetic or enumeration type; the operands of % shall have integral or enumeration type.
if (kind == IASTExpression.Kind.MULTIPLICATIVE_MULTIPLY || kind == IASTExpression.Kind.MULTIPLICATIVE_DIVIDE) {
@@ -1435,7 +1450,8 @@
if( !(isIntegralType(rhs, isRhsPointer) || rhs.isType(ITypeInfo.t__Bool, ITypeInfo.t_enumerator )) )
handleProblem( scope, IProblem.SEMANTIC_INVALID_CONVERSION_TYPE, null, rhsExp.getStartingOffset(), rhsExp.getEndingOffset(), rhsExp.getStartingLine(), true );
}
-
+ }
+
ITypeInfo info = TypeInfoProvider.newTypeInfo( );
if(
( lhs.checkBit(ITypeInfo.isLong) && lhs.getType() == ITypeInfo.t_double)