diff --git a/alib2abstraction/src/abstraction/ValueHolderInterface.hpp b/alib2abstraction/src/abstraction/ValueHolderInterface.hpp index 4c35df1cdb0a943b270504c2d1efe40bad500a05..b0a0a82500af199361ff08c788ad4e295b7bd3b3 100644 --- a/alib2abstraction/src/abstraction/ValueHolderInterface.hpp +++ b/alib2abstraction/src/abstraction/ValueHolderInterface.hpp @@ -19,6 +19,10 @@ class ValueHolderInterface : public Value { protected: ValueHolderInterface ( const std::shared_ptr < abstraction::OperationAbstraction > & ref, ParamQualifiers::ParamQualifierSet paramQualifierSet, bool isTemporary ) : Value ( ref ), m_paramQualifierSet ( paramQualifierSet ), m_isTemporary ( isTemporary ) { + if ( this->isLvalueRef ( ) && this->isTemporary ( ) ) + throw std::domain_error ( "Lvalue references cannot be a temporarie." ); + if ( this->isLvalueRef ( ) && this->isRvalueRef ( ) ) + throw std::domain_error ( "A reference cannot be both, rvalue and lvalue." ); } public: diff --git a/alib2abstraction/src/abstraction/ValueOperationAbstraction.hpp b/alib2abstraction/src/abstraction/ValueOperationAbstraction.hpp index b209b5cc9dd30d0b77cf126f87e885543b03a63a..347d08a7b391ac680c2b7eaa8f85b01ac4821c90 100644 --- a/alib2abstraction/src/abstraction/ValueOperationAbstraction.hpp +++ b/alib2abstraction/src/abstraction/ValueOperationAbstraction.hpp @@ -23,7 +23,7 @@ class ValueOperationAbstraction : virtual public OperationAbstraction { public: template < typename ... ParamTypes, typename Callable > inline std::shared_ptr < abstraction::Value > run_helper ( Callable callback, const ext::array < std::pair < std::shared_ptr < abstraction::Value >, bool >, sizeof ... ( ParamTypes ) > & inputs ) { - return std::make_shared < abstraction::ValueHolder < ReturnType > > ( this->getProxyAbstraction ( ), abstraction::apply < ParamTypes ... > ( callback, inputs ), true ); + return std::make_shared < abstraction::ValueHolder < ReturnType > > ( this->getProxyAbstraction ( ), abstraction::apply < ParamTypes ... > ( callback, inputs ), std::is_lvalue_reference_v < ReturnType > ? false : true ); } abstraction::ParamQualifiers::ParamQualifierSet getReturnTypeQualifiers ( ) const override { diff --git a/alib2cli/src/ast/statements/ResultPrintStatement.h b/alib2cli/src/ast/statements/ResultPrintStatement.h index 30bc7f77a30fa0a4dab8a1dd97e092951fecb0bf..dc0636a8d3da59c770b2081784032490956b91d3 100644 --- a/alib2cli/src/ast/statements/ResultPrintStatement.h +++ b/alib2cli/src/ast/statements/ResultPrintStatement.h @@ -18,7 +18,7 @@ public: return std::make_shared < abstraction::Void > ( nullptr ); res->attachInput ( prev, 0, false ); - res->attachInput ( std::make_shared < abstraction::ValueHolder < std::ostream & > > ( nullptr, common::Streams::out, true ), 1, false ); + res->attachInput ( std::make_shared < abstraction::ValueHolder < std::ostream & > > ( nullptr, common::Streams::out, false ), 1, false ); std::shared_ptr < abstraction::Value > result = res->eval ( ); if ( ! result ) throw std::invalid_argument ( "Eval of result print statement failed." );