summaryrefslogtreecommitdiff
path: root/TAO/TAO_IDL
diff options
context:
space:
mode:
authorFred Hornsey <hornseyf@objectcomputing.com>2021-06-07 23:43:19 -0500
committerFred Hornsey <hornseyf@objectcomputing.com>2021-06-07 23:43:19 -0500
commita4c5b22c20a1f1298a23d3ab57571237284b1963 (patch)
tree8ad2522b013ea2c8fd6f0dffa8e60e60342ae614 /TAO/TAO_IDL
parent85a1e615810419950f8f1280f80df9da9f5dee4d (diff)
downloadATCD-a4c5b22c20a1f1298a23d3ab57571237284b1963.tar.gz
Added WIP explicit_ints Test
And a bunch of fixes to get it to (sorta) work.
Diffstat (limited to 'TAO/TAO_IDL')
-rw-r--r--TAO/TAO_IDL/ast/ast_expression.cpp62
-rw-r--r--TAO/TAO_IDL/ast/ast_predefined_type.cpp16
-rw-r--r--TAO/TAO_IDL/ast/ast_union.cpp4
-rw-r--r--TAO/TAO_IDL/be/be_helper.cpp20
-rw-r--r--TAO/TAO_IDL/be/be_predefined_type.cpp25
-rw-r--r--TAO/TAO_IDL/be/be_visitor_constant/constant.cpp4
-rw-r--r--TAO/TAO_IDL/fe/fe_init.cpp8
7 files changed, 91 insertions, 48 deletions
diff --git a/TAO/TAO_IDL/ast/ast_expression.cpp b/TAO/TAO_IDL/ast/ast_expression.cpp
index 3f39c850cb8..c1b2c15b903 100644
--- a/TAO/TAO_IDL/ast/ast_expression.cpp
+++ b/TAO/TAO_IDL/ast/ast_expression.cpp
@@ -1300,7 +1300,7 @@ coerce_value (AST_Expression::AST_ExprValue *ev,
}
ev->u.cval = (char) ev->u.sval;
- ev->et = AST_Expression::EV_char;
+ ev->et = t;
return ev;
case AST_Expression::EV_ushort:
if (ev->u.usval > (unsigned short) ACE_CHAR_MAX)
@@ -1309,7 +1309,7 @@ coerce_value (AST_Expression::AST_ExprValue *ev,
}
ev->u.cval = (char) ev->u.usval;
- ev->et = AST_Expression::EV_char;
+ ev->et = t;
return ev;
case AST_Expression::EV_long:
if (ev->u.lval > (long) ACE_CHAR_MAX
@@ -1319,7 +1319,7 @@ coerce_value (AST_Expression::AST_ExprValue *ev,
}
ev->u.cval = (char) ev->u.lval;
- ev->et = AST_Expression::EV_char;
+ ev->et = t;
return ev;
case AST_Expression::EV_ulong:
if (ev->u.ulval > (unsigned long) ACE_CHAR_MAX)
@@ -1328,7 +1328,7 @@ coerce_value (AST_Expression::AST_ExprValue *ev,
}
ev->u.cval = (char) ev->u.ulval;
- ev->et = AST_Expression::EV_char;
+ ev->et = t;
return ev;
case AST_Expression::EV_longlong:
if (ev->u.llval > (ACE_CDR::LongLong) ACE_CHAR_MAX
@@ -1338,7 +1338,7 @@ coerce_value (AST_Expression::AST_ExprValue *ev,
}
ev->u.cval = (char) ev->u.llval;
- ev->et = AST_Expression::EV_char;
+ ev->et = t;
return ev;
case AST_Expression::EV_ulonglong:
if (( ev->u.ullval & ACE_CHAR_MAX) != ev->u.ullval)
@@ -1347,11 +1347,11 @@ coerce_value (AST_Expression::AST_ExprValue *ev,
}
ev->u.cval = (char) ev->u.ullval;
- ev->et = AST_Expression::EV_char;
+ ev->et = t;
return ev;
case AST_Expression::EV_bool:
ev->u.cval = (char) ev->u.bval;
- ev->et = AST_Expression::EV_char;
+ ev->et = t;
return ev;
case AST_Expression::EV_float:
if (ev->u.fval > (float) ACE_CHAR_MAX
@@ -1361,7 +1361,7 @@ coerce_value (AST_Expression::AST_ExprValue *ev,
}
ev->u.cval = (char) ev->u.fval;
- ev->et = AST_Expression::EV_char;
+ ev->et = t;
return ev;
case AST_Expression::EV_double:
if (ev->u.dval > (double) ACE_CHAR_MAX
@@ -1371,7 +1371,7 @@ coerce_value (AST_Expression::AST_ExprValue *ev,
}
ev->u.cval = (char) ev->u.dval;
- ev->et = AST_Expression::EV_char;
+ ev->et = t;
return ev;
case AST_Expression::EV_wchar:
if (ev->u.wcval > (ACE_CDR::WChar) ACE_CHAR_MAX)
@@ -1380,7 +1380,7 @@ coerce_value (AST_Expression::AST_ExprValue *ev,
}
ev->u.cval = (char) ev->u.wcval;
- ev->et = AST_Expression::EV_char;
+ ev->et = t;
return ev;
case AST_Expression::EV_uint8:
case AST_Expression::EV_octet:
@@ -1390,7 +1390,7 @@ coerce_value (AST_Expression::AST_ExprValue *ev,
}
ev->u.cval = (char) ev->u.oval;
- ev->et = AST_Expression::EV_char;
+ ev->et = t;
return ev;
case AST_Expression::EV_int8:
case AST_Expression::EV_char:
@@ -1514,7 +1514,7 @@ coerce_value (AST_Expression::AST_ExprValue *ev,
}
ev->u.oval = (unsigned char) ev->u.sval;
- ev->et = AST_Expression::EV_octet;
+ ev->et = t;
return ev;
case AST_Expression::EV_ushort:
if (ev->u.usval > (unsigned short) ACE_OCTET_MAX)
@@ -1523,7 +1523,7 @@ coerce_value (AST_Expression::AST_ExprValue *ev,
}
ev->u.oval = (unsigned char) ev->u.usval;
- ev->et = AST_Expression::EV_octet;
+ ev->et = t;
return ev;
case AST_Expression::EV_long:
if (ev->u.lval < 0
@@ -1533,7 +1533,7 @@ coerce_value (AST_Expression::AST_ExprValue *ev,
}
ev->u.oval = (unsigned char) ev->u.lval;
- ev->et = AST_Expression::EV_octet;
+ ev->et = t;
return ev;
case AST_Expression::EV_ulong:
if (ev->u.ulval > (unsigned long) ACE_OCTET_MAX)
@@ -1542,7 +1542,7 @@ coerce_value (AST_Expression::AST_ExprValue *ev,
}
ev->u.oval = (unsigned char) ev->u.ulval;
- ev->et = AST_Expression::EV_octet;
+ ev->et = t;
return ev;
case AST_Expression::EV_longlong:
if (ev->u.llval < 0
@@ -1552,7 +1552,7 @@ coerce_value (AST_Expression::AST_ExprValue *ev,
}
ev->u.oval = (unsigned char) ev->u.llval;
- ev->et = AST_Expression::EV_octet;
+ ev->et = t;
return ev;
case AST_Expression::EV_ulonglong:
if ((ev->u.ullval & ACE_OCTET_MAX) != ev->u.ullval)
@@ -1561,11 +1561,11 @@ coerce_value (AST_Expression::AST_ExprValue *ev,
}
ev->u.oval = (unsigned char) ev->u.ullval;
- ev->et = AST_Expression::EV_octet;
+ ev->et = t;
return ev;
case AST_Expression::EV_bool:
ev->u.oval = (unsigned char) ((ev->u.bval == false) ? 1 : 0);
- ev->et = AST_Expression::EV_octet;
+ ev->et = t;
return ev;
case AST_Expression::EV_float:
if (ev->u.fval < 0.0
@@ -1575,7 +1575,7 @@ coerce_value (AST_Expression::AST_ExprValue *ev,
}
ev->u.oval = (unsigned char) ev->u.fval;
- ev->et = AST_Expression::EV_octet;
+ ev->et = t;
return ev;
case AST_Expression::EV_double:
if (ev->u.dval < 0.0
@@ -1585,7 +1585,7 @@ coerce_value (AST_Expression::AST_ExprValue *ev,
}
ev->u.oval = (unsigned char) ev->u.dval;
- ev->et = AST_Expression::EV_octet;
+ ev->et = t;
return ev;
case AST_Expression::EV_int8:
case AST_Expression::EV_char:
@@ -1595,7 +1595,7 @@ coerce_value (AST_Expression::AST_ExprValue *ev,
}
ev->u.oval = (unsigned char) ev->u.cval;
- ev->et = AST_Expression::EV_octet;
+ ev->et = t;
return ev;
case AST_Expression::EV_wchar:
if (ev->u.wcval > (ACE_CDR::WChar) ACE_OCTET_MAX)
@@ -1604,7 +1604,7 @@ coerce_value (AST_Expression::AST_ExprValue *ev,
}
ev->u.oval = (unsigned char) ev->u.wcval;
- ev->et = AST_Expression::EV_octet;
+ ev->et = t;
return ev;
case AST_Expression::EV_uint8:
case AST_Expression::EV_octet:
@@ -2469,38 +2469,38 @@ AST_Expression::eval_un_op (AST_Expression::EvalKind ek)
switch (this->pd_v1->ev ()->et)
{
case EV_short:
- retval->et = EV_short;
retval->u.sval = ~this->pd_v1->ev ()->u.sval;
break;
case EV_ushort:
- retval->et = EV_ushort;
retval->u.usval = ~this->pd_v1->ev ()->u.usval;
break;
case EV_long:
- retval->et = EV_long;
retval->u.lval = ~this->pd_v1->ev ()->u.lval;
break;
case EV_ulong:
- retval->et = EV_ulong;
retval->u.ulval = ~this->pd_v1->ev ()->u.ulval;
break;
case EV_longlong:
- retval->et = EV_longlong;
retval->u.llval = ~this->pd_v1->ev ()->u.llval;
break;
case EV_ulonglong:
- retval->et = EV_ulonglong;
retval->u.ullval = ~this->pd_v1->ev ()->u.ullval;
break;
case EV_octet:
- retval->et = EV_octet;
retval->u.oval = ~this->pd_v1->ev ()->u.oval;
break;
+ case AST_Expression::EV_int8:
+ retval->u.int8val = ~pd_v1->ev ()->u.int8val;
+ break;
+ case AST_Expression::EV_uint8:
+ retval->u.uint8val = ~pd_v1->ev ()->u.uint8val;
+ break;
default:
delete retval;
retval = nullptr;
return nullptr;
}
+ retval->et = pd_v1->ev ()->et;
break;
default:
@@ -2517,14 +2517,14 @@ AST_Expression::eval_un_op (AST_Expression::EvalKind ek)
AST_Expression::AST_ExprValue *
AST_Expression::eval_symbol (AST_Expression::EvalKind ek)
{
- UTL_Scope *s = nullptr;
+ UTL_Scope *s = nullptr;
AST_Decl *d = nullptr;
AST_Constant *c = nullptr;
// Is there a symbol stored?
if (this->pd_n == nullptr)
{
- idl_global->err ()->eval_error (this);
+ idl_global->err ()->eval_error (this);
return nullptr;
}
diff --git a/TAO/TAO_IDL/ast/ast_predefined_type.cpp b/TAO/TAO_IDL/ast/ast_predefined_type.cpp
index e52ee5f0ab7..ca4be3164cc 100644
--- a/TAO/TAO_IDL/ast/ast_predefined_type.cpp
+++ b/TAO/TAO_IDL/ast/ast_predefined_type.cpp
@@ -71,8 +71,11 @@ trademarks or registered trademarks of Sun Microsystems, Inc.
#include "ast_predefined_type.h"
#include "ast_visitor.h"
-#include "utl_identifier.h"
#include "global_extern.h"
+
+#include "utl_identifier.h"
+#include "utl_err.h"
+
#include "ace/Log_Msg.h"
#include "ace/OS_NS_stdio.h"
@@ -190,9 +193,16 @@ AST_PredefinedType::AST_PredefinedType (PredefinedType t,
ACE_NEW (id,
Identifier (n->last_component ()->get_string ()));
break;
+ case AST_PredefinedType::PT_uint8:
+ ACE_NEW (id, Identifier ("Uint8"));
+ break;
+ case AST_PredefinedType::PT_int8:
+ ACE_NEW (id, Identifier ("Int8"));
+ break;
default:
- ACE_ERROR ((LM_ERROR,
- "AST_PredefinedType - bad enum value\n"));
+ idl_global->err ()->misc_error ("AST_PredefinedType: bad enum value", this);
+ // Nothing else to do. We will segfault if we continue, return, or throw Bailout
+ ACE_OS::abort ();
}
ACE_NEW (conc_name,
diff --git a/TAO/TAO_IDL/ast/ast_union.cpp b/TAO/TAO_IDL/ast/ast_union.cpp
index 503fd01310e..763300473b4 100644
--- a/TAO/TAO_IDL/ast/ast_union.cpp
+++ b/TAO/TAO_IDL/ast/ast_union.cpp
@@ -155,7 +155,7 @@ AST_Union::AST_Union (AST_ConcreteType *dt,
this->pd_udisc_type = AST_Expression::EV_ushort;
break;
case AST_PredefinedType::PT_int8:
- this->pd_udisc_type = AST_Expression::EV_char;
+ this->pd_udisc_type = AST_Expression::EV_int8;
break;
case AST_PredefinedType::PT_char:
this->pd_udisc_type = AST_Expression::EV_char;
@@ -164,7 +164,7 @@ AST_Union::AST_Union (AST_ConcreteType *dt,
this->pd_udisc_type = AST_Expression::EV_wchar;
break;
case AST_PredefinedType::PT_uint8:
- this->pd_udisc_type = AST_Expression::EV_char;
+ this->pd_udisc_type = AST_Expression::EV_uint8;
break;
case AST_PredefinedType::PT_octet:
this->pd_udisc_type = AST_Expression::EV_octet;
diff --git a/TAO/TAO_IDL/be/be_helper.cpp b/TAO/TAO_IDL/be/be_helper.cpp
index bc982a5988e..218bc0ac534 100644
--- a/TAO/TAO_IDL/be/be_helper.cpp
+++ b/TAO/TAO_IDL/be/be_helper.cpp
@@ -530,8 +530,24 @@ TAO_OutStream::print (AST_Expression *expr)
break;
case AST_Expression::EV_longlong:
this->TAO_OutStream::print ("ACE_INT64_LITERAL (");
- this->TAO_OutStream::print (ACE_INT64_FORMAT_SPECIFIER_ASCII,
- ev->u.llval);
+ {
+ ACE_CDR::LongLong value = ev->u.llval;
+ /*
+ * It seem in C/C++ compilers the minus sign and the bare number are
+ * parsed separately for negative integer literals. This can cause
+ * compilers to complain when using the minimum value of a signed integer
+ * because the number without the minus sign is 1 past the max signed
+ * value.
+ *
+ * https://stackoverflow.com/questions/65007935/integer-constant-is-so-large-that-it-is-unsigned-compiler-warning-rational
+ *
+ * Apparently the workaround is to write it as `VALUE_PLUS_ONE - 1`.
+ */
+ const bool min_value = value == ACE_INT64_MIN;
+ if (min_value) value += 1;
+ TAO_OutStream::print (ACE_INT64_FORMAT_SPECIFIER_ASCII, value);
+ if (min_value) TAO_OutStream::print (" - 1");
+ }
this->TAO_OutStream::print (")");
break;
case AST_Expression::EV_ulonglong:
diff --git a/TAO/TAO_IDL/be/be_predefined_type.cpp b/TAO/TAO_IDL/be/be_predefined_type.cpp
index 7aa8a813c9b..d311d098c33 100644
--- a/TAO/TAO_IDL/be/be_predefined_type.cpp
+++ b/TAO/TAO_IDL/be/be_predefined_type.cpp
@@ -14,9 +14,12 @@
#include "be_predefined_type.h"
#include "be_visitor.h"
#include "be_helper.h"
-#include "utl_identifier.h"
+
#include "global_extern.h"
+#include "utl_identifier.h"
+#include "utl_err.h"
+
#include "ace/Log_Msg.h"
#include "ace/ACE.h"
#include "ace/OS_NS_stdio.h"
@@ -198,19 +201,19 @@ be_predefined_type::compute_tc_name ()
case AST_PredefinedType::PT_any:
ACE_NEW (id,
Identifier ("_tc_any"));
- break;
+ break;
case AST_PredefinedType::PT_object:
ACE_NEW (id,
Identifier ("_tc_Object"));
- break;
+ break;
case AST_PredefinedType::PT_value:
ACE_NEW (id,
Identifier ("_tc_ValueBase"));
- break;
+ break;
case AST_PredefinedType::PT_abstract:
ACE_NEW (id,
Identifier ("_tc_AbstractBase"));
- break;
+ break;
case AST_PredefinedType::PT_pseudo:
{
char tcname [100];
@@ -222,9 +225,17 @@ be_predefined_type::compute_tc_name ()
Identifier (tcname));
break;
}
- default:
- ACE_ERROR ((LM_WARNING, "Unknown or invalid predefined type"));
+ case AST_PredefinedType::PT_uint8:
+ ACE_NEW (id, Identifier ("_tc_Uint8"));
break;
+ case AST_PredefinedType::PT_int8:
+ ACE_NEW (id, Identifier ("_tc_Int8"));
+ break;
+ default:
+ idl_global->err ()->misc_error (
+ "be_predefined_type::compute_tc_name: Unknown or invalid predefined type", this);
+ // Nothing else to do. We will segfault if we continue, return, or throw Bailout
+ ACE_OS::abort ();
}
ACE_NEW (conc_name,
diff --git a/TAO/TAO_IDL/be/be_visitor_constant/constant.cpp b/TAO/TAO_IDL/be/be_visitor_constant/constant.cpp
index 1c11373df70..a841b6f20d6 100644
--- a/TAO/TAO_IDL/be/be_visitor_constant/constant.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_constant/constant.cpp
@@ -39,9 +39,9 @@ const char *exprtype_to_cpp_corba_type (AST_Expression::ExprType et)
case AST_Expression::EV_fixed:
return "Fixed";
case AST_Expression::EV_int8:
- return "CORBA::Octet";
+ return "CORBA::Int8";
case AST_Expression::EV_uint8:
- return "CORBA::Octet";
+ return "CORBA::Uint8";
default:
return 0;
}
diff --git a/TAO/TAO_IDL/fe/fe_init.cpp b/TAO/TAO_IDL/fe/fe_init.cpp
index 24c8284bf4d..e8989d15298 100644
--- a/TAO/TAO_IDL/fe/fe_init.cpp
+++ b/TAO/TAO_IDL/fe/fe_init.cpp
@@ -81,7 +81,7 @@ const size_t LOCAL_ESCAPES_BUFFER_SIZE = 1024;
void
fe_populate_global_scope ()
{
- // No need to created a scoped name for the basic types, the
+ // No need to create a scoped name for the basic types, the
// AST_PredefinedType constructor will do that.
AST_PredefinedType *pdt = nullptr;
@@ -210,6 +210,12 @@ fe_populate_global_scope ()
m->fe_add_predefined_type (pdt);
+ m->fe_add_predefined_type (idl_global->gen ()->create_predefined_type (
+ AST_PredefinedType::PT_uint8, nullptr));
+
+ m->fe_add_predefined_type (idl_global->gen ()->create_predefined_type (
+ AST_PredefinedType::PT_int8, nullptr));
+
Identifier Object_id ("Object");
UTL_ScopedName Object_name (&Object_id, nullptr);