2015-12-05 02:09:47 +00:00
/*
2016-11-18 23:13:20 +00:00
This file is part of solidity .
2015-12-05 02:09:47 +00:00
2016-11-18 23:13:20 +00:00
solidity is free software : you can redistribute it and / or modify
2015-12-05 02:09:47 +00:00
it under the terms of the GNU General Public License as published by
the Free Software Foundation , either version 3 of the License , or
( at your option ) any later version .
2016-11-18 23:13:20 +00:00
solidity is distributed in the hope that it will be useful ,
2015-12-05 02:09:47 +00:00
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
2016-11-18 23:13:20 +00:00
along with solidity . If not , see < http : //www.gnu.org/licenses/>.
2015-12-05 02:09:47 +00:00
*/
/**
* @ author Christian < c @ ethdev . com >
* @ date 2015
* Tests for high level features like import .
*/
2017-02-02 11:39:12 +00:00
# include <test/libsolidity/ErrorCheck.h>
2018-03-14 11:04:04 +00:00
# include <test/Options.h>
2017-02-02 11:39:12 +00:00
2018-11-14 13:59:30 +00:00
# include <liblangutil/Exceptions.h>
2015-12-05 02:09:47 +00:00
# include <libsolidity/interface/CompilerStack.h>
2017-02-02 11:39:12 +00:00
# include <boost/test/unit_test.hpp>
# include <string>
2015-12-05 02:09:47 +00:00
using namespace std ;
namespace dev
{
namespace solidity
{
namespace test
{
BOOST_AUTO_TEST_SUITE ( SolidityImports )
BOOST_AUTO_TEST_CASE ( smoke_test )
{
CompilerStack c ;
2016-08-24 10:15:35 +00:00
c . addSource ( " a " , " contract C {} pragma solidity >=0.0; " ) ;
2018-02-23 18:29:20 +00:00
c . setEVMVersion ( dev : : test : : Options : : get ( ) . evmVersion ( ) ) ;
2015-12-05 02:09:47 +00:00
BOOST_CHECK ( c . compile ( ) ) ;
}
BOOST_AUTO_TEST_CASE ( regular_import )
{
CompilerStack c ;
2016-08-24 10:15:35 +00:00
c . addSource ( " a " , " contract C {} pragma solidity >=0.0; " ) ;
c . addSource ( " b " , " import \" a \" ; contract D is C {} pragma solidity >=0.0; " ) ;
2018-02-23 18:29:20 +00:00
c . setEVMVersion ( dev : : test : : Options : : get ( ) . evmVersion ( ) ) ;
2015-12-05 02:09:47 +00:00
BOOST_CHECK ( c . compile ( ) ) ;
}
BOOST_AUTO_TEST_CASE ( import_does_not_clutter_importee )
{
CompilerStack c ;
2016-08-24 10:15:35 +00:00
c . addSource ( " a " , " contract C { D d; } pragma solidity >=0.0; " ) ;
c . addSource ( " b " , " import \" a \" ; contract D is C {} pragma solidity >=0.0; " ) ;
2018-02-23 18:29:20 +00:00
c . setEVMVersion ( dev : : test : : Options : : get ( ) . evmVersion ( ) ) ;
2015-12-05 02:09:47 +00:00
BOOST_CHECK ( ! c . compile ( ) ) ;
}
BOOST_AUTO_TEST_CASE ( import_is_transitive )
{
CompilerStack c ;
2016-08-24 10:15:35 +00:00
c . addSource ( " a " , " contract C { } pragma solidity >=0.0; " ) ;
c . addSource ( " b " , " import \" a \" ; pragma solidity >=0.0; " ) ;
c . addSource ( " c " , " import \" b \" ; contract D is C {} pragma solidity >=0.0; " ) ;
2018-02-23 18:29:20 +00:00
c . setEVMVersion ( dev : : test : : Options : : get ( ) . evmVersion ( ) ) ;
2015-12-05 02:09:47 +00:00
BOOST_CHECK ( c . compile ( ) ) ;
}
BOOST_AUTO_TEST_CASE ( circular_import )
{
CompilerStack c ;
2016-08-24 10:15:35 +00:00
c . addSource ( " a " , " import \" b \" ; contract C { D d; } pragma solidity >=0.0; " ) ;
c . addSource ( " b " , " import \" a \" ; contract D { C c; } pragma solidity >=0.0; " ) ;
2018-02-23 18:29:20 +00:00
c . setEVMVersion ( dev : : test : : Options : : get ( ) . evmVersion ( ) ) ;
2015-12-05 02:09:47 +00:00
BOOST_CHECK ( c . compile ( ) ) ;
}
2015-12-09 16:35:20 +00:00
BOOST_AUTO_TEST_CASE ( relative_import )
{
CompilerStack c ;
2016-08-24 10:15:35 +00:00
c . addSource ( " a " , " import \" ./dir/b \" ; contract A is B {} pragma solidity >=0.0; " ) ;
c . addSource ( " dir/b " , " contract B {} pragma solidity >=0.0; " ) ;
c . addSource ( " dir/c " , " import \" ../a \" ; contract C is A {} pragma solidity >=0.0; " ) ;
2018-02-23 18:29:20 +00:00
c . setEVMVersion ( dev : : test : : Options : : get ( ) . evmVersion ( ) ) ;
2015-12-09 16:35:20 +00:00
BOOST_CHECK ( c . compile ( ) ) ;
}
BOOST_AUTO_TEST_CASE ( relative_import_multiplex )
{
CompilerStack c ;
2016-08-24 10:15:35 +00:00
c . addSource ( " a " , " contract A {} pragma solidity >=0.0; " ) ;
c . addSource ( " dir/a/b/c " , " import \" ../../.././a \" ; contract B is A {} pragma solidity >=0.0; " ) ;
2018-02-23 18:29:20 +00:00
c . setEVMVersion ( dev : : test : : Options : : get ( ) . evmVersion ( ) ) ;
2015-12-09 16:35:20 +00:00
BOOST_CHECK ( c . compile ( ) ) ;
}
2015-12-15 14:46:03 +00:00
BOOST_AUTO_TEST_CASE ( simple_alias )
{
CompilerStack c ;
2016-08-24 10:15:35 +00:00
c . addSource ( " a " , " contract A {} pragma solidity >=0.0; " ) ;
2018-06-28 16:08:45 +00:00
c . addSource ( " dir/a/b/c " , " import \" ../../.././a \" as x; contract B is x.A { function() external { x.A r = x.A(20); } } pragma solidity >=0.0; " ) ;
2018-02-23 18:29:20 +00:00
c . setEVMVersion ( dev : : test : : Options : : get ( ) . evmVersion ( ) ) ;
2015-12-15 14:46:03 +00:00
BOOST_CHECK ( c . compile ( ) ) ;
}
2016-01-11 18:40:04 +00:00
BOOST_AUTO_TEST_CASE ( library_name_clash )
{
CompilerStack c ;
2016-12-21 19:45:34 +00:00
c . addSource ( " a " , " library A {} pragma solidity >=0.0; " ) ;
c . addSource ( " b " , " library A {} pragma solidity >=0.0; " ) ;
2016-12-22 16:30:53 +00:00
c . addSource ( " c " , " import {A} from \" ./a \" ; import {A} from \" ./b \" ; " ) ;
2018-02-23 18:29:20 +00:00
c . setEVMVersion ( dev : : test : : Options : : get ( ) . evmVersion ( ) ) ;
2016-01-11 18:40:04 +00:00
BOOST_CHECK ( ! c . compile ( ) ) ;
}
BOOST_AUTO_TEST_CASE ( library_name_clash_with_contract )
{
CompilerStack c ;
2016-08-24 10:15:35 +00:00
c . addSource ( " a " , " contract A {} pragma solidity >=0.0; " ) ;
c . addSource ( " b " , " library A {} pragma solidity >=0.0; " ) ;
2018-02-23 18:29:20 +00:00
c . setEVMVersion ( dev : : test : : Options : : get ( ) . evmVersion ( ) ) ;
2016-01-11 18:40:04 +00:00
BOOST_CHECK ( c . compile ( ) ) ;
}
2016-01-11 12:55:58 +00:00
BOOST_AUTO_TEST_CASE ( complex_import )
{
CompilerStack c ;
2016-08-24 10:15:35 +00:00
c . addSource ( " a " , " contract A {} contract B {} contract C { struct S { uint a; } } pragma solidity >=0.0; " ) ;
2016-01-11 12:55:58 +00:00
c . addSource ( " b " , " import \" a \" as x; import {B as b, C as c, C} from \" a \" ; "
2018-07-12 04:18:50 +00:00
" contract D is b { function f(c.S memory var1, x.C.S memory var2, C.S memory var3) internal {} } pragma solidity >=0.0; " ) ;
2018-02-23 18:29:20 +00:00
c . setEVMVersion ( dev : : test : : Options : : get ( ) . evmVersion ( ) ) ;
2016-01-11 12:55:58 +00:00
BOOST_CHECK ( c . compile ( ) ) ;
}
BOOST_AUTO_TEST_CASE ( name_clash_in_import )
{
CompilerStack c ;
2016-08-24 10:15:35 +00:00
c . addSource ( " a " , " contract A {} pragma solidity >=0.0; " ) ;
c . addSource ( " b " , " import \" a \" ; contract A {} pragma solidity >=0.0; " ) ;
2018-02-23 18:29:20 +00:00
c . setEVMVersion ( dev : : test : : Options : : get ( ) . evmVersion ( ) ) ;
2016-01-11 12:55:58 +00:00
BOOST_CHECK ( ! c . compile ( ) ) ;
2016-08-24 10:15:35 +00:00
c . addSource ( " b " , " import \" a \" as A; contract A {} pragma solidity >=0.0; " ) ;
2018-02-23 18:29:20 +00:00
c . setEVMVersion ( dev : : test : : Options : : get ( ) . evmVersion ( ) ) ;
2016-01-11 12:55:58 +00:00
BOOST_CHECK ( ! c . compile ( ) ) ;
2016-08-24 10:15:35 +00:00
c . addSource ( " b " , " import {A as b} from \" a \" ; contract b {} pragma solidity >=0.0; " ) ;
2018-02-23 18:29:20 +00:00
c . setEVMVersion ( dev : : test : : Options : : get ( ) . evmVersion ( ) ) ;
2016-01-11 12:55:58 +00:00
BOOST_CHECK ( ! c . compile ( ) ) ;
2016-08-24 10:15:35 +00:00
c . addSource ( " b " , " import {A} from \" a \" ; contract A {} pragma solidity >=0.0; " ) ;
2018-02-23 18:29:20 +00:00
c . setEVMVersion ( dev : : test : : Options : : get ( ) . evmVersion ( ) ) ;
2016-01-11 12:55:58 +00:00
BOOST_CHECK ( ! c . compile ( ) ) ;
2016-08-24 10:15:35 +00:00
c . addSource ( " b " , " import {A} from \" a \" ; contract B {} pragma solidity >=0.0; " ) ;
2018-02-23 18:29:20 +00:00
c . setEVMVersion ( dev : : test : : Options : : get ( ) . evmVersion ( ) ) ;
2016-01-11 12:55:58 +00:00
BOOST_CHECK ( c . compile ( ) ) ;
}
2016-06-07 17:44:32 +00:00
BOOST_AUTO_TEST_CASE ( remappings )
{
CompilerStack c ;
2018-08-09 18:37:49 +00:00
c . setRemappings ( vector < CompilerStack : : Remapping > { { " " , " s " , " s_1.4.6 " } , { " " , " t " , " Tee " } } ) ;
2016-08-24 10:15:35 +00:00
c . addSource ( " a " , " import \" s/s.sol \" ; contract A is S {} pragma solidity >=0.0; " ) ;
c . addSource ( " b " , " import \" t/tee.sol \" ; contract A is Tee {} pragma solidity >=0.0; " ) ;
c . addSource ( " s_1.4.6/s.sol " , " contract S {} pragma solidity >=0.0; " ) ;
c . addSource ( " Tee/tee.sol " , " contract Tee {} pragma solidity >=0.0; " ) ;
2018-02-23 18:29:20 +00:00
c . setEVMVersion ( dev : : test : : Options : : get ( ) . evmVersion ( ) ) ;
2016-06-07 17:44:32 +00:00
BOOST_CHECK ( c . compile ( ) ) ;
}
BOOST_AUTO_TEST_CASE ( context_dependent_remappings )
{
CompilerStack c ;
2018-08-09 18:37:49 +00:00
c . setRemappings ( vector < CompilerStack : : Remapping > { { " a " , " s " , " s_1.4.6 " } , { " b " , " s " , " s_1.4.7 " } } ) ;
2016-08-24 10:15:35 +00:00
c . addSource ( " a/a.sol " , " import \" s/s.sol \" ; contract A is SSix {} pragma solidity >=0.0; " ) ;
c . addSource ( " b/b.sol " , " import \" s/s.sol \" ; contract B is SSeven {} pragma solidity >=0.0; " ) ;
c . addSource ( " s_1.4.6/s.sol " , " contract SSix {} pragma solidity >=0.0; " ) ;
c . addSource ( " s_1.4.7/s.sol " , " contract SSeven {} pragma solidity >=0.0; " ) ;
2018-02-23 18:29:20 +00:00
c . setEVMVersion ( dev : : test : : Options : : get ( ) . evmVersion ( ) ) ;
2016-06-07 17:44:32 +00:00
BOOST_CHECK ( c . compile ( ) ) ;
}
2017-01-03 17:16:33 +00:00
BOOST_AUTO_TEST_CASE ( filename_with_period )
{
CompilerStack c ;
c . addSource ( " a/a.sol " , " import \" .b.sol \" ; contract A is B {} pragma solidity >=0.0; " ) ;
c . addSource ( " a/.b.sol " , " contract B {} pragma solidity >=0.0; " ) ;
2018-02-23 18:29:20 +00:00
c . setEVMVersion ( dev : : test : : Options : : get ( ) . evmVersion ( ) ) ;
2017-01-03 17:16:33 +00:00
BOOST_CHECK ( ! c . compile ( ) ) ;
}
2017-01-05 00:29:54 +00:00
BOOST_AUTO_TEST_CASE ( context_dependent_remappings_ensure_default_and_module_preserved )
{
CompilerStack c ;
2018-08-09 18:37:49 +00:00
c . setRemappings ( vector < CompilerStack : : Remapping > {
{ " " , " foo " , " vendor/foo_2.0.0 " } ,
{ " vendor/bar " , " foo " , " vendor/foo_1.0.0 " } ,
{ " " , " bar " , " vendor/bar " }
} ) ;
2017-01-05 18:01:27 +00:00
c . addSource ( " main.sol " , " import \" foo/foo.sol \" ; import {Bar} from \" bar/bar.sol \" ; contract Main is Foo2, Bar {} pragma solidity >=0.0; " ) ;
c . addSource ( " vendor/bar/bar.sol " , " import \" foo/foo.sol \" ; contract Bar {Foo1 foo;} pragma solidity >=0.0; " ) ;
2017-01-05 00:29:54 +00:00
c . addSource ( " vendor/foo_1.0.0/foo.sol " , " contract Foo1 {} pragma solidity >=0.0; " ) ;
c . addSource ( " vendor/foo_2.0.0/foo.sol " , " contract Foo2 {} pragma solidity >=0.0; " ) ;
2018-02-23 18:29:20 +00:00
c . setEVMVersion ( dev : : test : : Options : : get ( ) . evmVersion ( ) ) ;
2017-01-05 00:29:54 +00:00
BOOST_CHECK ( c . compile ( ) ) ;
}
2017-01-11 17:45:14 +00:00
BOOST_AUTO_TEST_CASE ( context_dependent_remappings_order_independent )
{
CompilerStack c ;
2018-08-09 18:37:49 +00:00
c . setRemappings ( vector < CompilerStack : : Remapping > { { " a " , " x/y/z " , " d " } , { " a/b " , " x " , " e " } } ) ;
2017-01-11 17:45:14 +00:00
c . addSource ( " a/main.sol " , " import \" x/y/z/z.sol \" ; contract Main is D {} pragma solidity >=0.0; " ) ;
c . addSource ( " a/b/main.sol " , " import \" x/y/z/z.sol \" ; contract Main is E {} pragma solidity >=0.0; " ) ;
2017-01-11 18:03:54 +00:00
c . addSource ( " d/z.sol " , " contract D {} pragma solidity >=0.0; " ) ;
2017-01-11 17:45:14 +00:00
c . addSource ( " e/y/z/z.sol " , " contract E {} pragma solidity >=0.0; " ) ;
2018-02-23 18:29:20 +00:00
c . setEVMVersion ( dev : : test : : Options : : get ( ) . evmVersion ( ) ) ;
2017-01-11 17:45:14 +00:00
BOOST_CHECK ( c . compile ( ) ) ;
CompilerStack d ;
2018-08-09 18:37:49 +00:00
d . setRemappings ( vector < CompilerStack : : Remapping > { { " a/b " , " x " , " e " } , { " a " , " x/y/z " , " d " } } ) ;
2017-01-11 17:45:14 +00:00
d . addSource ( " a/main.sol " , " import \" x/y/z/z.sol \" ; contract Main is D {} pragma solidity >=0.0; " ) ;
d . addSource ( " a/b/main.sol " , " import \" x/y/z/z.sol \" ; contract Main is E {} pragma solidity >=0.0; " ) ;
2017-01-11 18:03:54 +00:00
d . addSource ( " d/z.sol " , " contract D {} pragma solidity >=0.0; " ) ;
2017-01-11 17:45:14 +00:00
d . addSource ( " e/y/z/z.sol " , " contract E {} pragma solidity >=0.0; " ) ;
2018-02-23 18:29:20 +00:00
d . setEVMVersion ( dev : : test : : Options : : get ( ) . evmVersion ( ) ) ;
2017-01-11 17:45:14 +00:00
BOOST_CHECK ( d . compile ( ) ) ;
}
2017-02-02 11:39:12 +00:00
BOOST_AUTO_TEST_CASE ( shadowing_via_import )
{
CompilerStack c ;
c . addSource ( " a " , " library A {} pragma solidity >=0.0; " ) ;
c . addSource ( " b " , " library A {} pragma solidity >=0.0; " ) ;
c . addSource ( " c " , " import {A} from \" ./a \" ; import {A} from \" ./b \" ; " ) ;
2018-02-23 18:29:20 +00:00
c . setEVMVersion ( dev : : test : : Options : : get ( ) . evmVersion ( ) ) ;
2017-02-02 11:39:12 +00:00
BOOST_CHECK ( ! c . compile ( ) ) ;
}
BOOST_AUTO_TEST_CASE ( shadowing_builtins_with_imports )
{
CompilerStack c ;
c . addSource ( " B.sol " , " contract X {} pragma solidity >=0.0; " ) ;
c . addSource ( " b " , R " (
pragma solidity > = 0.0 ;
import * as msg from " B.sol " ;
contract C {
}
) " );
2018-02-23 18:29:20 +00:00
c . setEVMVersion ( dev : : test : : Options : : get ( ) . evmVersion ( ) ) ;
2017-02-02 11:39:12 +00:00
BOOST_CHECK ( c . compile ( ) ) ;
2017-07-31 12:55:54 +00:00
size_t errorCount = 0 ;
2017-02-02 11:39:12 +00:00
for ( auto const & e : c . errors ( ) )
{
string const * msg = e - > comment ( ) ;
BOOST_REQUIRE ( msg ) ;
2017-07-31 12:55:54 +00:00
if ( msg - > find ( " pre-release " ) ! = string : : npos )
continue ;
2017-02-02 11:39:12 +00:00
BOOST_CHECK (
msg - > find ( " shadows a builtin symbol " ) ! = string : : npos
) ;
2017-07-31 12:55:54 +00:00
errorCount + + ;
2017-02-02 11:39:12 +00:00
}
2017-07-31 12:55:54 +00:00
BOOST_CHECK_EQUAL ( errorCount , 1 ) ;
2017-02-02 11:39:12 +00:00
}
BOOST_AUTO_TEST_CASE ( shadowing_builtins_with_multiple_imports )
{
CompilerStack c ;
c . addSource ( " B.sol " , " contract msg {} contract block{} pragma solidity >=0.0; " ) ;
c . addSource ( " b " , R " (
pragma solidity > = 0.0 ;
import { msg , block } from " B.sol " ;
contract C {
}
) " );
2018-02-23 18:29:20 +00:00
c . setEVMVersion ( dev : : test : : Options : : get ( ) . evmVersion ( ) ) ;
2017-02-02 11:39:12 +00:00
BOOST_CHECK ( c . compile ( ) ) ;
auto numErrors = c . errors ( ) . size ( ) ;
// Sometimes we get the prerelease warning, sometimes not.
BOOST_CHECK ( 4 < = numErrors & & numErrors < = 5 ) ;
for ( auto const & e : c . errors ( ) )
{
string const * msg = e - > comment ( ) ;
BOOST_REQUIRE ( msg ) ;
BOOST_CHECK (
msg - > find ( " pre-release " ) ! = string : : npos | |
msg - > find ( " shadows a builtin symbol " ) ! = string : : npos
) ;
}
}
2018-02-16 09:58:50 +00:00
BOOST_AUTO_TEST_CASE ( shadowing_builtins_with_alias )
{
CompilerStack c ;
c . addSource ( " B.sol " , " contract C {} pragma solidity >=0.0; " ) ;
c . addSource ( " b " , R " (
pragma solidity > = 0.0 ;
import { C as msg } from " B.sol " ;
) " );
2018-02-23 18:29:20 +00:00
c . setEVMVersion ( dev : : test : : Options : : get ( ) . evmVersion ( ) ) ;
2018-02-16 09:58:50 +00:00
BOOST_CHECK ( c . compile ( ) ) ;
auto numErrors = c . errors ( ) . size ( ) ;
// Sometimes we get the prerelease warning, sometimes not.
BOOST_CHECK ( 1 < = numErrors & & numErrors < = 2 ) ;
for ( auto const & e : c . errors ( ) )
{
string const * msg = e - > comment ( ) ;
BOOST_REQUIRE ( msg ) ;
BOOST_CHECK (
msg - > find ( " pre-release " ) ! = string : : npos | |
msg - > find ( " shadows a builtin symbol " ) ! = string : : npos
) ;
}
}
2017-02-02 11:39:12 +00:00
2019-03-04 13:33:46 +00:00
BOOST_AUTO_TEST_CASE ( inheritance_abi_encoder_mismatch_1 )
{
CompilerStack c ;
c . addSource ( " A.sol " , R " (
pragma solidity > = 0.0 ;
pragma experimental ABIEncoderV2 ;
contract A
{
struct S { uint a ; }
S public s ;
function f ( S memory _s ) returns ( S memory , S memory ) { }
}
) " );
c . addSource ( " B.sol " , R " (
pragma solidity > = 0.0 ;
pragma experimental ABIEncoderV2 ;
import " ./A.sol " ;
contract B is A { }
) " );
c . addSource ( " C.sol " , R " (
pragma solidity > = 0.0 ;
import " ./B.sol " ;
contract C is B { }
) " );
c . setEVMVersion ( dev : : test : : Options : : get ( ) . evmVersion ( ) ) ;
BOOST_CHECK ( ! c . compile ( ) ) ;
int typeErrors = 0 ;
// Sometimes we get the prerelease warning, sometimes not.
for ( auto const & e : c . errors ( ) )
{
if ( e - > type ( ) ! = langutil : : Error : : Type : : TypeError )
continue ;
typeErrors + + ;
string const * msg = e - > comment ( ) ;
BOOST_REQUIRE ( msg ) ;
BOOST_CHECK_EQUAL ( * msg , std : : string ( " Contract \" C \" does not use the new experimental ABI encoder but wants to inherit from a contract which uses types that require it. Use \" pragma experimental ABIEncoderV2; \" for the inheriting contract as well to enable the feature. " ) ) ;
}
BOOST_CHECK_EQUAL ( typeErrors , 1 ) ;
}
BOOST_AUTO_TEST_CASE ( inheritance_abi_encoder_mismatch_2 )
{
CompilerStack c ;
c . addSource ( " A.sol " , R " (
pragma solidity > = 0.0 ;
pragma experimental ABIEncoderV2 ;
contract A
{
struct S { uint a ; }
S public s ;
function f ( S memory _s ) returns ( S memory , S memory ) { }
}
) " );
c . addSource ( " B.sol " , R " (
pragma solidity > = 0.0 ;
import " ./A.sol " ;
contract B is A { }
) " );
c . addSource ( " C.sol " , R " (
pragma solidity > = 0.0 ;
import " ./B.sol " ;
contract C is B { }
) " );
c . setEVMVersion ( dev : : test : : Options : : get ( ) . evmVersion ( ) ) ;
BOOST_CHECK ( ! c . compile ( ) ) ;
int typeErrors = 0 ;
// Sometimes we get the prerelease warning, sometimes not.
for ( auto const & e : c . errors ( ) )
{
if ( e - > type ( ) ! = langutil : : Error : : Type : : TypeError )
continue ;
typeErrors + + ;
string const * msg = e - > comment ( ) ;
BOOST_REQUIRE ( msg ) ;
BOOST_CHECK_EQUAL ( * msg , std : : string ( " Contract \" B \" does not use the new experimental ABI encoder but wants to inherit from a contract which uses types that require it. Use \" pragma experimental ABIEncoderV2; \" for the inheriting contract as well to enable the feature. " ) ) ;
}
BOOST_CHECK_EQUAL ( typeErrors , 1 ) ;
}
BOOST_AUTO_TEST_CASE ( inheritance_abi_encoder_match )
{
CompilerStack c ;
c . addSource ( " A.sol " , R " (
pragma solidity > = 0.0 ;
pragma experimental ABIEncoderV2 ;
contract A
{
struct S { uint a ; }
S public s ;
function f ( S memory _s ) public returns ( S memory , S memory ) { }
}
) " );
c . addSource ( " B.sol " , R " (
pragma solidity > = 0.0 ;
pragma experimental ABIEncoderV2 ;
import " ./A.sol " ;
contract B is A { }
) " );
c . addSource ( " C.sol " , R " (
pragma solidity > = 0.0 ;
pragma experimental ABIEncoderV2 ;
import " ./B.sol " ;
contract C is B { }
) " );
c . setEVMVersion ( dev : : test : : Options : : get ( ) . evmVersion ( ) ) ;
BOOST_CHECK ( c . compile ( ) ) ;
int typeErrors = 0 ;
// Sometimes we get the prerelease warning, sometimes not.
for ( auto const & e : c . errors ( ) )
{
if ( e - > type ( ) ! = langutil : : Error : : Type : : TypeError )
continue ;
typeErrors + + ;
}
BOOST_CHECK_EQUAL ( typeErrors , 0 ) ;
}
2015-12-05 02:09:47 +00:00
BOOST_AUTO_TEST_SUITE_END ( )
}
}
} // end namespaces