aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--docs/introduction-to-smart-contracts.rst31
-rw-r--r--libsolidity/interface/SourceReferenceFormatter.cpp10
-rw-r--r--test/cmdlineErrorReports/too_long_line.sol4
-rw-r--r--test/cmdlineErrorReports/too_long_line.sol.ref7
-rw-r--r--test/cmdlineErrorReports/too_long_line_both_sides_short.sol5
-rw-r--r--test/cmdlineErrorReports/too_long_line_both_sides_short.sol.ref7
-rw-r--r--test/cmdlineErrorReports/too_long_line_edge_in.sol4
-rw-r--r--test/cmdlineErrorReports/too_long_line_edge_in.sol.ref7
-rw-r--r--test/cmdlineErrorReports/too_long_line_edge_out.sol4
-rw-r--r--test/cmdlineErrorReports/too_long_line_edge_out.sol.ref7
-rw-r--r--test/cmdlineErrorReports/too_long_line_left_short.sol4
-rw-r--r--test/cmdlineErrorReports/too_long_line_left_short.sol.ref7
-rw-r--r--test/cmdlineErrorReports/too_long_line_right_short.sol5
-rw-r--r--test/cmdlineErrorReports/too_long_line_right_short.sol.ref7
-rwxr-xr-xtest/cmdlineTests.sh16
15 files changed, 111 insertions, 14 deletions
diff --git a/docs/introduction-to-smart-contracts.rst b/docs/introduction-to-smart-contracts.rst
index 7bfee0a1..7de0d19b 100644
--- a/docs/introduction-to-smart-contracts.rst
+++ b/docs/introduction-to-smart-contracts.rst
@@ -183,23 +183,34 @@ the user interface.
.. index:: coin
-The special function ``Coin`` is the
-constructor which is run during creation of the contract and
+The constructor is a special function which is run during creation of the contract and
cannot be called afterwards. It permanently stores the address of the person creating the
-contract: ``msg`` (together with ``tx`` and ``block``) is a magic global variable that
+contract: ``msg`` (together with ``tx`` and ``block``) is a special global variable that
contains some properties which allow access to the blockchain. ``msg.sender`` is
always the address where the current (external) function call came from.
Finally, the functions that will actually end up with the contract and can be called
by users and contracts alike are ``mint`` and ``send``.
If ``mint`` is called by anyone except the account that created the contract,
-nothing will happen. On the other hand, ``send`` can be used by anyone (who already
-has some of these coins) to send coins to anyone else. Note that if you use
-this contract to send coins to an address, you will not see anything when you
-look at that address on a blockchain explorer, because the fact that you sent
-coins and the changed balances are only stored in the data storage of this
-particular coin contract. By the use of events it is relatively easy to create
-a "blockchain explorer" that tracks transactions and balances of your new coin.
+nothing will happen. This is ensured by the special function ``require`` which
+causes all changes to be reverted if its argument evaluates to false.
+The second call to ``require`` ensures that there will not be too many coins,
+which could cause overflow errors later.
+
+On the other hand, ``send`` can be used by anyone (who already
+has some of these coins) to send coins to anyone else. If you do not have
+enough coins to send, the ``require`` call will fail and also provide the
+user with an appropriate error message string.
+
+.. note::
+ If you use
+ this contract to send coins to an address, you will not see anything when you
+ look at that address on a blockchain explorer, because the fact that you sent
+ coins and the changed balances are only stored in the data storage of this
+ particular coin contract. By the use of events it is relatively easy to create
+ a "blockchain explorer" that tracks transactions and balances of your new coin,
+ but you have to inspect the coin contract address and not the addresses of the
+ coin owners.
.. _blockchain-basics:
diff --git a/libsolidity/interface/SourceReferenceFormatter.cpp b/libsolidity/interface/SourceReferenceFormatter.cpp
index 0f014372..4724fc7f 100644
--- a/libsolidity/interface/SourceReferenceFormatter.cpp
+++ b/libsolidity/interface/SourceReferenceFormatter.cpp
@@ -55,8 +55,14 @@ void SourceReferenceFormatter::printSourceLocation(SourceLocation const* _locati
}
if (line.length() > 150)
{
- line = " ... " + line.substr(startColumn, locationLength) + " ... ";
- startColumn = 5;
+ int len = line.length();
+ line = line.substr(max(0, startColumn - 35), min(startColumn, 35) + min(locationLength + 35, len - startColumn));
+ if (startColumn + locationLength + 35 < len)
+ line += " ...";
+ if (startColumn > 35) {
+ line = " ... " + line;
+ startColumn = 40;
+ }
endColumn = startColumn + locationLength;
}
diff --git a/test/cmdlineErrorReports/too_long_line.sol b/test/cmdlineErrorReports/too_long_line.sol
new file mode 100644
index 00000000..7df1057a
--- /dev/null
+++ b/test/cmdlineErrorReports/too_long_line.sol
@@ -0,0 +1,4 @@
+contract C {
+ function ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff(announcementType Type, string Announcement, string Link, bool Oppositable, string _str, uint256 _uint, address _addr) onlyOwner external {
+}
+}
diff --git a/test/cmdlineErrorReports/too_long_line.sol.ref b/test/cmdlineErrorReports/too_long_line.sol.ref
new file mode 100644
index 00000000..7cad93ee
--- /dev/null
+++ b/test/cmdlineErrorReports/too_long_line.sol.ref
@@ -0,0 +1,7 @@
+
+too_long_line.sol:1:1: Warning: Source file does not specify required compiler version!
+contract C {
+^ (Relevant source part starts here and spans across multiple lines).
+too_long_line.sol:2:164: Error: Identifier not found or not unique.
+ ... ffffffffffffffffffffffffffffffffff(announcementType Type, string Announcement, string ...
+ ^--------------^
diff --git a/test/cmdlineErrorReports/too_long_line_both_sides_short.sol b/test/cmdlineErrorReports/too_long_line_both_sides_short.sol
new file mode 100644
index 00000000..062f0292
--- /dev/null
+++ b/test/cmdlineErrorReports/too_long_line_both_sides_short.sol
@@ -0,0 +1,5 @@
+contract C {
+ function f(announcementTypeXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX Type,
+ string Announcement, string Link, bool Oppositable, string _str, uint256 _uint, address _addr) onlyOwner external {
+}
+}
diff --git a/test/cmdlineErrorReports/too_long_line_both_sides_short.sol.ref b/test/cmdlineErrorReports/too_long_line_both_sides_short.sol.ref
new file mode 100644
index 00000000..f2ea427a
--- /dev/null
+++ b/test/cmdlineErrorReports/too_long_line_both_sides_short.sol.ref
@@ -0,0 +1,7 @@
+
+too_long_line_both_sides_short.sol:1:1: Warning: Source file does not specify required compiler version!
+contract C {
+^ (Relevant source part starts here and spans across multiple lines).
+too_long_line_both_sides_short.sol:2:15: Error: Identifier not found or not unique.
+ function f(announcementTypeXXXXXXXXXXXXXXXXXXX ... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX Type,
+ ^-------------------------------------------------------------------------^
diff --git a/test/cmdlineErrorReports/too_long_line_edge_in.sol b/test/cmdlineErrorReports/too_long_line_edge_in.sol
new file mode 100644
index 00000000..6f181c83
--- /dev/null
+++ b/test/cmdlineErrorReports/too_long_line_edge_in.sol
@@ -0,0 +1,4 @@
+contract C {
+ function ffffffffffffffffffffff(announcementTypeTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT Ty, string A) onlyOwner external {
+}
+}
diff --git a/test/cmdlineErrorReports/too_long_line_edge_in.sol.ref b/test/cmdlineErrorReports/too_long_line_edge_in.sol.ref
new file mode 100644
index 00000000..b6699933
--- /dev/null
+++ b/test/cmdlineErrorReports/too_long_line_edge_in.sol.ref
@@ -0,0 +1,7 @@
+
+too_long_line_edge_in.sol:1:1: Warning: Source file does not specify required compiler version!
+contract C {
+^ (Relevant source part starts here and spans across multiple lines).
+too_long_line_edge_in.sol:2:36: Error: Identifier not found or not unique.
+ function ffffffffffffffffffffff(announcementTypeTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT Ty, string A) onlyOwner external {
+ ^----------------------------------------------------------------------------------------------^
diff --git a/test/cmdlineErrorReports/too_long_line_edge_out.sol b/test/cmdlineErrorReports/too_long_line_edge_out.sol
new file mode 100644
index 00000000..29d3cee6
--- /dev/null
+++ b/test/cmdlineErrorReports/too_long_line_edge_out.sol
@@ -0,0 +1,4 @@
+contract C {
+ function fffffffffffffffffffffff(announcementTypeTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT Typ, string A) onlyOwner external {
+}
+}
diff --git a/test/cmdlineErrorReports/too_long_line_edge_out.sol.ref b/test/cmdlineErrorReports/too_long_line_edge_out.sol.ref
new file mode 100644
index 00000000..76df589a
--- /dev/null
+++ b/test/cmdlineErrorReports/too_long_line_edge_out.sol.ref
@@ -0,0 +1,7 @@
+
+too_long_line_edge_out.sol:1:1: Warning: Source file does not specify required compiler version!
+contract C {
+^ (Relevant source part starts here and spans across multiple lines).
+too_long_line_edge_out.sol:2:37: Error: Identifier not found or not unique.
+ ... function fffffffffffffffffffffff(announcementTypeTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT Typ, string A) onlyOwner external ...
+ ^----------------------------------------------------------------------------------------------^
diff --git a/test/cmdlineErrorReports/too_long_line_left_short.sol b/test/cmdlineErrorReports/too_long_line_left_short.sol
new file mode 100644
index 00000000..2accfcce
--- /dev/null
+++ b/test/cmdlineErrorReports/too_long_line_left_short.sol
@@ -0,0 +1,4 @@
+contract C {
+ function f(announcementType Type, string Announcement, string Link, bool Oppositable, string _str, uint256 _uint, address _addr) onlyOwner external {
+}
+}
diff --git a/test/cmdlineErrorReports/too_long_line_left_short.sol.ref b/test/cmdlineErrorReports/too_long_line_left_short.sol.ref
new file mode 100644
index 00000000..efaa559d
--- /dev/null
+++ b/test/cmdlineErrorReports/too_long_line_left_short.sol.ref
@@ -0,0 +1,7 @@
+
+too_long_line_left_short.sol:1:1: Warning: Source file does not specify required compiler version!
+contract C {
+^ (Relevant source part starts here and spans across multiple lines).
+too_long_line_left_short.sol:2:15: Error: Identifier not found or not unique.
+ function f(announcementType Type, string Announcement, string ...
+ ^--------------^
diff --git a/test/cmdlineErrorReports/too_long_line_right_short.sol b/test/cmdlineErrorReports/too_long_line_right_short.sol
new file mode 100644
index 00000000..936b3961
--- /dev/null
+++ b/test/cmdlineErrorReports/too_long_line_right_short.sol
@@ -0,0 +1,5 @@
+contract C {
+ function ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff(announcementType Type,
+ string Announcement, string Link, bool Oppositable, string _str, uint256 _uint, address _addr) onlyOwner external {
+}
+}
diff --git a/test/cmdlineErrorReports/too_long_line_right_short.sol.ref b/test/cmdlineErrorReports/too_long_line_right_short.sol.ref
new file mode 100644
index 00000000..2b0c6d8c
--- /dev/null
+++ b/test/cmdlineErrorReports/too_long_line_right_short.sol.ref
@@ -0,0 +1,7 @@
+
+too_long_line_right_short.sol:1:1: Warning: Source file does not specify required compiler version!
+contract C {
+^ (Relevant source part starts here and spans across multiple lines).
+too_long_line_right_short.sol:2:164: Error: Identifier not found or not unique.
+ ... ffffffffffffffffffffffffffffffffff(announcementType Type,
+ ^--------------^
diff --git a/test/cmdlineTests.sh b/test/cmdlineTests.sh
index 6f8a8ac1..f7577cb3 100755
--- a/test/cmdlineTests.sh
+++ b/test/cmdlineTests.sh
@@ -117,6 +117,8 @@ test_solc_file_input_failures() {
exitCode=$?
set -e
+ stderr=`sed 's/.*This is a pre-release compiler version, please do not use it in production.*$//' $stderr_path`
+
if [[ $exitCode -eq 0 ]]; then
printError "Incorrect exit code. Expected failure (non-zero) but got success (0)."
rm -f $stdout_path $stderr_path
@@ -133,12 +135,12 @@ test_solc_file_input_failures() {
exit 1
fi
- if [[ "$(cat $stderr_path)" != "${stderr_expected}" ]]; then
+ if [[ "$stderr" != "${stderr_expected}" ]]; then
printError "Incorrect output on stderr received. Expected:"
echo -e "${stderr_expected}"
printError "But got:"
- cat $stderr_path
+ echo $stderr
rm -f $stdout_path $stderr_path
exit 1
fi
@@ -156,6 +158,16 @@ printTask "Testing passing empty remappings..."
test_solc_file_input_failures "${0}" "=/some/remapping/target" "" "Invalid remapping: \"=/some/remapping/target\"."
test_solc_file_input_failures "${0}" "ctx:=/some/remapping/target" "" "Invalid remapping: \"ctx:=/some/remapping/target\"."
+printTask "Testing passing location printing..."
+(
+cd "$REPO_ROOT"/test/cmdlineErrorReports/
+for file in *.sol
+do
+ ret=`cat $file.ref`
+ test_solc_file_input_failures "$file" "" "" "$ret"
+done
+)
+
printTask "Compiling various other contracts and libraries..."
(
cd "$REPO_ROOT"/test/compilationTests/