diff --git a/exprtk.hpp b/exprtk.hpp
index 3f49ae5..9faebf0 100644
--- a/exprtk.hpp
+++ b/exprtk.hpp
@@ -10290,10 +10290,12 @@
          typedef expression_node<T>* expression_ptr;
          typedef results_context<T>  results_context_t;
 
-         return_envelope_node(expression_ptr body, results_context_t& rc)
+         return_envelope_node(expression_ptr body,
+                              results_context_t& rc, bool& rtrn_invoked)
          : results_context_(&rc),
-           body_(body),
-           body_deletable_(branch_deletable(body_))
+           return_invoked_ (rtrn_invoked),
+           body_           (body),
+           body_deletable_ (branch_deletable(body_))
          {}
 
         ~return_envelope_node()
@@ -10308,12 +10310,14 @@
          {
             try
             {
+               return_invoked_ = false;
                results_context_->clear();
 
                return body_->value();
             }
             catch(const return_exception&)
             {
+               return_invoked_ = true;
                return std::numeric_limits<T>::quiet_NaN();
             }
          }
@@ -10326,6 +10330,7 @@
       private:
 
          results_context_t* results_context_;
+         bool&              return_invoked_;
          expression_ptr     body_;
          bool               body_deletable_;
       };
@@ -13599,6 +13604,13 @@
          }
 
          template <typename node_type,
+                   typename T1, typename T2, typename T3>
+         inline expression_node<typename node_type::value_type>* allocate_crr(const T1& t1, T2& t2, T3& t3) const
+         {
+            return new node_type(t1,t2,t3);
+         }
+
+         template <typename node_type,
                    typename T1, typename T2>
          inline expression_node<typename node_type::value_type>* allocate_rc(T1& t1, const T2& t2) const
          {
@@ -15411,14 +15423,16 @@
 
          expression_holder()
          : ref_count(0),
-           expr(0),
-           results_(0)
+           expr     (0),
+           results  (0),
+           return_invoked(false)
          {}
 
          expression_holder(expression_ptr e)
          : ref_count(1),
-           expr(e),
-           results_(0)
+           expr     (e),
+           results  (0),
+           return_invoked(false)
          {}
 
         ~expression_holder()
@@ -15454,16 +15468,17 @@
                }
             }
 
-            if (results_)
+            if (results)
             {
-               delete results_;
+               delete results;
             }
          }
 
          std::size_t ref_count;
          expression_ptr expr;
          local_data_list_t local_data_list;
-         results_context_t* results_;
+         results_context_t* results;
+         bool return_invoked;
 
          friend class function_compositor<T>;
       };
@@ -15583,8 +15598,8 @@
 
       inline const results_context_t& results() const
       {
-         if (expression_holder_->results_)
-            return (*expression_holder_->results_);
+         if (expression_holder_->results)
+            return (*expression_holder_->results);
          else
          {
             static const results_context_t null_results;
@@ -15592,6 +15607,11 @@
          }
       }
 
+      inline bool return_invoked() const
+      {
+         return (expression_holder_->return_invoked);
+      }
+
    private:
 
       inline symtab_list_t get_symbol_table_list() const
@@ -15685,10 +15705,15 @@
       {
          if (rc)
          {
-            expression_holder_->results_ = rc;
+            expression_holder_->results = rc;
          }
       }
 
+      inline bool& rtrn_invk_ref()
+      {
+         return expression_holder_->return_invoked;
+      }
+
       expression_holder* expression_holder_;
       symtab_list_t      symbol_table_list_;
 
@@ -16780,7 +16805,8 @@
          : options_(options),
            collect_variables_  ((options_ & e_ct_variables  ) == e_ct_variables  ),
            collect_functions_  ((options_ & e_ct_functions  ) == e_ct_functions  ),
-           collect_assignments_((options_ & e_ct_assignments) == e_ct_assignments)
+           collect_assignments_((options_ & e_ct_assignments) == e_ct_assignments),
+           return_present_(false)
          {}
 
          template <typename Allocator,
@@ -16833,6 +16859,7 @@
          {
             symbol_name_list_    .clear();
             assignment_name_list_.clear();
+            return_present_ = false;
          }
 
          bool& collect_variables()
@@ -16850,6 +16877,11 @@
             return collect_assignments_;
          }
 
+         bool return_present() const
+         {
+            return return_present_;
+         }
+
       private:
 
          inline void add_symbol(const std::string& symbol, const symbol_type st)
@@ -16890,6 +16922,7 @@
          bool collect_variables_;
          bool collect_functions_;
          bool collect_assignments_;
+         bool return_present_;
          symbol_list_t symbol_name_list_;
          symbol_list_t assignment_name_list_;
 
@@ -17367,7 +17400,10 @@
          {
             if (state_.return_stmt_present)
             {
-               e = expression_generator_.return_envelope(e,results_context_);
+               dec_.return_present_ = true;
+
+               e = expression_generator_
+                     .return_envelope(e,results_context_,expr.rtrn_invk_ref());
             }
 
             expr.set_expression(e);
@@ -24128,11 +24164,13 @@
             }
          }
 
-         inline expression_node_ptr return_envelope(expression_node_ptr body, results_context_t* rc)
+         inline expression_node_ptr return_envelope(expression_node_ptr body,
+                                                    results_context_t* rc,
+                                                    bool& return_invoked)
          {
             typedef details::return_envelope_node<Type> alloc_type;
 
-            return node_allocator_->allocate_cr<alloc_type>(body,(*rc));
+            return node_allocator_->allocate_crr<alloc_type>(body,(*rc),return_invoked);
          }
 
          inline expression_node_ptr vector_element(const std::string& symbol,
diff --git a/exprtk_test.cpp b/exprtk_test.cpp
index 950a063..58521f2 100644
--- a/exprtk_test.cpp
+++ b/exprtk_test.cpp
@@ -6774,12 +6774,28 @@
             failure = true;
             continue;
          }
+         else if (!parser.dec().return_present())
+         {
+            printf("run_test21() - Expected a return statement   Expression: %s  [1]\n",
+                   expression_list[i].c_str());
+
+            failure = true;
+            continue;
+         }
 
          expression.value();
 
          std::string pattern = results_to_string<T>(expression.results());
 
-         if (result_list[i] != pattern)
+         if (!expression.return_invoked())
+         {
+            printf("run_test21() - Invalid return invoke state [1] Expression: %s\n",
+                   expression_list[i].c_str());
+
+            failure = true;
+            continue;
+         }
+         else if (result_list[i] != pattern)
          {
             printf("run_test21() - Invalid return results [1] Expected %s  Got: %s  Expression: %s\n",
                    result_list[i].c_str(),
@@ -6840,12 +6856,28 @@
             failure = true;
             continue;
          }
+         else if (!parser.dec().return_present())
+         {
+            printf("run_test21() - Expected a return statement   Expression: %s  [2]\n",
+                   expression_list[i].c_str());
+
+            failure = true;
+            continue;
+         }
 
          expression.value();
 
          std::string pattern = results_to_string<T>(expression.results());
 
-         if (result_list[i] != pattern)
+         if (!expression.return_invoked())
+         {
+            printf("run_test21() - Invalid return invoke state [2] Expression: %s\n",
+                   expression_list[i].c_str());
+
+            failure = true;
+            continue;
+         }
+         else if (result_list[i] != pattern)
          {
             printf("run_test21() - Invalid return results [2] Expected %s  Got: %s  Expression: %s\n",
                    result_list[i].c_str(),
