aboutsummaryrefslogtreecommitdiffstats
path: root/lib/compiler/test/compilation_SUITE_data
diff options
context:
space:
mode:
authorErlang/OTP <[email protected]>2009-11-20 14:54:40 +0000
committerErlang/OTP <[email protected]>2009-11-20 14:54:40 +0000
commit84adefa331c4159d432d22840663c38f155cd4c1 (patch)
treebff9a9c66adda4df2106dfd0e5c053ab182a12bd /lib/compiler/test/compilation_SUITE_data
downloadotp-84adefa331c4159d432d22840663c38f155cd4c1.tar.gz
otp-84adefa331c4159d432d22840663c38f155cd4c1.tar.bz2
otp-84adefa331c4159d432d22840663c38f155cd4c1.zip
The R13B03 release.OTP_R13B03
Diffstat (limited to 'lib/compiler/test/compilation_SUITE_data')
-rw-r--r--lib/compiler/test/compilation_SUITE_data/bad_functional_value.erl28
-rw-r--r--lib/compiler/test/compilation_SUITE_data/beam_compiler_1.erl31
-rw-r--r--lib/compiler/test/compilation_SUITE_data/beam_compiler_10.erl27
-rw-r--r--lib/compiler/test/compilation_SUITE_data/beam_compiler_11.erl31
-rw-r--r--lib/compiler/test/compilation_SUITE_data/beam_compiler_12.erl29
-rw-r--r--lib/compiler/test/compilation_SUITE_data/beam_compiler_2.erl35
-rw-r--r--lib/compiler/test/compilation_SUITE_data/beam_compiler_3.erl29
-rw-r--r--lib/compiler/test/compilation_SUITE_data/beam_compiler_4.erl150
-rw-r--r--lib/compiler/test/compilation_SUITE_data/beam_compiler_5.erl28
-rw-r--r--lib/compiler/test/compilation_SUITE_data/beam_compiler_6.erl153
-rw-r--r--lib/compiler/test/compilation_SUITE_data/beam_compiler_8.erl31
-rw-r--r--lib/compiler/test/compilation_SUITE_data/beam_compiler_9.erl67
-rw-r--r--lib/compiler/test/compilation_SUITE_data/bin_syntax_1.erl31
-rw-r--r--lib/compiler/test/compilation_SUITE_data/bin_syntax_2.erl41
-rw-r--r--lib/compiler/test/compilation_SUITE_data/bin_syntax_3.erl35
-rw-r--r--lib/compiler/test/compilation_SUITE_data/bin_syntax_4.erl32
-rw-r--r--lib/compiler/test/compilation_SUITE_data/bin_syntax_6.erl39
-rw-r--r--lib/compiler/test/compilation_SUITE_data/catch_in_catch.erl51
-rw-r--r--lib/compiler/test/compilation_SUITE_data/compiler_1.erl742
-rw-r--r--lib/compiler/test/compilation_SUITE_data/compiler_3.erl33
-rw-r--r--lib/compiler/test/compilation_SUITE_data/compiler_5.erl49
-rw-r--r--lib/compiler/test/compilation_SUITE_data/complex_guard.erl31
-rw-r--r--lib/compiler/test/compilation_SUITE_data/const_list_256.erl282
-rw-r--r--lib/compiler/test/compilation_SUITE_data/convopts.erl159
-rw-r--r--lib/compiler/test/compilation_SUITE_data/guards.erl106
-rw-r--r--lib/compiler/test/compilation_SUITE_data/live_var.erl30
-rw-r--r--lib/compiler/test/compilation_SUITE_data/long_string.erl670
-rw-r--r--lib/compiler/test/compilation_SUITE_data/nested_tuples_in_case_expr.erl36
-rw-r--r--lib/compiler/test/compilation_SUITE_data/on_load.erl18
-rw-r--r--lib/compiler/test/compilation_SUITE_data/opt_crash.erl65
-rw-r--r--lib/compiler/test/compilation_SUITE_data/other/vsn_1.erl19
-rw-r--r--lib/compiler/test/compilation_SUITE_data/other/vsn_3.erl24
-rw-r--r--lib/compiler/test/compilation_SUITE_data/otp_2141.erl24
-rw-r--r--lib/compiler/test/compilation_SUITE_data/otp_2173.erl31
-rw-r--r--lib/compiler/test/compilation_SUITE_data/otp_2330.erl35
-rw-r--r--lib/compiler/test/compilation_SUITE_data/otp_2380.erl36
-rw-r--r--lib/compiler/test/compilation_SUITE_data/otp_4790.erl63
-rw-r--r--lib/compiler/test/compilation_SUITE_data/otp_5076.erl27
-rw-r--r--lib/compiler/test/compilation_SUITE_data/otp_5092.erl39
-rw-r--r--lib/compiler/test/compilation_SUITE_data/otp_5151.erl61
-rw-r--r--lib/compiler/test/compilation_SUITE_data/otp_5235.erl84
-rw-r--r--lib/compiler/test/compilation_SUITE_data/otp_5244.erl47
-rw-r--r--lib/compiler/test/compilation_SUITE_data/otp_5404.erl51
-rw-r--r--lib/compiler/test/compilation_SUITE_data/otp_5436.erl201
-rw-r--r--lib/compiler/test/compilation_SUITE_data/otp_5481.erl527
-rw-r--r--lib/compiler/test/compilation_SUITE_data/otp_5553.erl82
-rw-r--r--lib/compiler/test/compilation_SUITE_data/otp_5632.erl230
-rw-r--r--lib/compiler/test/compilation_SUITE_data/otp_5714.erl46
-rw-r--r--lib/compiler/test/compilation_SUITE_data/otp_5872.erl46
-rw-r--r--lib/compiler/test/compilation_SUITE_data/otp_6121.erl48
-rw-r--r--lib/compiler/test/compilation_SUITE_data/otp_6121a.erl32
-rw-r--r--lib/compiler/test/compilation_SUITE_data/otp_6121b.erl33
-rw-r--r--lib/compiler/test/compilation_SUITE_data/otp_7202.erl48
-rw-r--r--lib/compiler/test/compilation_SUITE_data/pattern_expr.erl30
-rw-r--r--lib/compiler/test/compilation_SUITE_data/trycatch_4.erl50
-rw-r--r--lib/compiler/test/compilation_SUITE_data/vsn_1.erl21
-rw-r--r--lib/compiler/test/compilation_SUITE_data/vsn_2.erl21
-rw-r--r--lib/compiler/test/compilation_SUITE_data/vsn_3.erl22
58 files changed, 5067 insertions, 0 deletions
diff --git a/lib/compiler/test/compilation_SUITE_data/bad_functional_value.erl b/lib/compiler/test/compilation_SUITE_data/bad_functional_value.erl
new file mode 100644
index 0000000000..126a573e83
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/bad_functional_value.erl
@@ -0,0 +1,28 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2003-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(bad_functional_value).
+
+-export([?MODULE/0,a/0]).
+
+?MODULE() ->
+ ok.
+
+a() ->
+ .list_to_atom("ok").
+
diff --git a/lib/compiler/test/compilation_SUITE_data/beam_compiler_1.erl b/lib/compiler/test/compilation_SUITE_data/beam_compiler_1.erl
new file mode 100644
index 0000000000..d6c9c869c8
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/beam_compiler_1.erl
@@ -0,0 +1,31 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(beam_compiler_1).
+-export([beam_compiler_1/0]).
+
+beam_compiler_1() ->
+ ok.
+
+-record(foo,{a,b}).
+
+try_me() ->
+ X = #foo{},
+ Y = #foo{},
+ {X#foo.a == Y#foo.a,X#foo.b}.
+
diff --git a/lib/compiler/test/compilation_SUITE_data/beam_compiler_10.erl b/lib/compiler/test/compilation_SUITE_data/beam_compiler_10.erl
new file mode 100644
index 0000000000..a1264055bd
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/beam_compiler_10.erl
@@ -0,0 +1,27 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1999-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(beam_compiler_10).
+-export([?MODULE/0,start_timer/0]).
+
+?MODULE() ->
+ ok.
+
+start_timer() ->
+ Self = self(),
+ spawn(fun() -> receive after 1000 -> Self ! show end end).
diff --git a/lib/compiler/test/compilation_SUITE_data/beam_compiler_11.erl b/lib/compiler/test/compilation_SUITE_data/beam_compiler_11.erl
new file mode 100644
index 0000000000..4be32ab505
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/beam_compiler_11.erl
@@ -0,0 +1,31 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1999-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(beam_compiler_11).
+
+-export([?MODULE/0,a/0]).
+
+?MODULE() ->
+ ok.
+
+a() ->
+ case foo:bar() of
+ A -> ok
+ end,
+ A = 3.
+
diff --git a/lib/compiler/test/compilation_SUITE_data/beam_compiler_12.erl b/lib/compiler/test/compilation_SUITE_data/beam_compiler_12.erl
new file mode 100644
index 0000000000..baee6b9bce
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/beam_compiler_12.erl
@@ -0,0 +1,29 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2000-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(beam_compiler_12).
+
+-export([?MODULE/0,t/1]).
+
+?MODULE() ->
+ ok.
+
+t(Name) ->
+ {ok = {file_info,_,regular,_,AccTime1,ModTime1,_,_,_,_,_,_,_,_}} =
+ prim_file:read_file_info(Name).
+
diff --git a/lib/compiler/test/compilation_SUITE_data/beam_compiler_2.erl b/lib/compiler/test/compilation_SUITE_data/beam_compiler_2.erl
new file mode 100644
index 0000000000..0c094d584a
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/beam_compiler_2.erl
@@ -0,0 +1,35 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(beam_compiler_2).
+-export([beam_compiler_2/0]).
+
+beam_compiler_2() ->
+ ok.
+
+-record(foo,{a,b}).
+
+try_me() ->
+ try_me({foo,x,z},{foo,y,z}).
+
+try_me(X,Y) ->
+ f(X#foo.a =/= Y#foo.a,X#foo.b =/= X#foo.b).
+
+f(A,B) ->
+ A.
+
diff --git a/lib/compiler/test/compilation_SUITE_data/beam_compiler_3.erl b/lib/compiler/test/compilation_SUITE_data/beam_compiler_3.erl
new file mode 100644
index 0000000000..aced49b69c
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/beam_compiler_3.erl
@@ -0,0 +1,29 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(beam_compiler_3).
+-export([beam_compiler_3/0, f/0]).
+
+%% From Ulf Wiger.
+
+beam_compiler_3() ->
+ ok.
+
+f() ->
+ [_|T] = lists:reverse("xxx"),
+ T.
diff --git a/lib/compiler/test/compilation_SUITE_data/beam_compiler_4.erl b/lib/compiler/test/compilation_SUITE_data/beam_compiler_4.erl
new file mode 100644
index 0000000000..5e74d3cd3c
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/beam_compiler_4.erl
@@ -0,0 +1,150 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(beam_compiler_4).
+-export([beam_compiler_4/0]).
+
+%% From Ulf Wiger.
+
+beam_compiler_4() ->
+ ok.
+
+selected_alarm(_Env, Parameters) ->
+ UnWebParam = x,
+ [Time, Severity, Info, Cause,
+ Type, Sender, Name, FaultId] = bar:foo(),
+
+ %% The following case generates no test heap instructions,
+ %% but the test heap generated before the call to bar:foo(),
+ %% will be moved to here. And the number of words to allocate
+ %% will be ridicously big (> 65535) and will not fit in a 16 big
+ %% word.
+
+ SenderLink = case Name of
+ "pchScheduledConnectionAlarm" ->
+ Sender;
+ "pchVpVcAlarm" ->
+ Sender;
+ "pchSystemMemoryAlarm" ->
+ Sender;
+ "uniProtocolRestartFailureAlarm" ->
+ Sender;
+ "spvcScheduledConnectionAlarm" ->
+ Sender;
+ "eqmSwitchCoreInterfaceAlarm" ->
+ Sender;
+ "atmPhysicalLayerAlarm" ->
+ Sender;
+ "atmBufferCongestionAlarm" ->
+ Sender;
+ "sdhLinkAlarm" ->
+ Sender;
+ "sdhFarEndAlarm" ->
+ Sender;
+ "sdhUpperQosAlarm" ->
+ Sender;
+ "sdhLowerQosAlarm" ->
+ Sender;
+ "eqmSwitchCoreAlarm" ->
+ Sender;
+ "eqmEtAlarm" ->
+ Sender;
+ "eqmHwIdentityFaultAlarm" ->
+ Sender;
+ "eqmOperatorBlockedEquipmentAlarm" ->
+ Sender;
+ "pdh34PathAlarm" ->
+ Sender;
+ "pdh34ObservationAlarm" ->
+ Sender;
+ "pdh34UpperQosAlarm" ->
+ Sender;
+ "pdh34LowerQosAlarm" ->
+ Sender;
+ "nsySynchRefAlarm" ->
+ Sender;
+ "nsySynchRefBlockedAlarm" ->
+ Sender;
+ "nsySynchNodeHoldoverAlarm" ->
+ Sender;
+ "nsySynchNodeNotWorkingAlarm" ->
+ Sender;
+ "eqmAtbAlarm" ->
+ Sender;
+ "eqmCbEtAlarm" ->
+ Sender;
+ "eqmCpAlarm" ->
+ Sender;
+ "eqmCpInterfaceAlarm" ->
+ Sender;
+ "eqmCbClkAlarm" ->
+ Sender;
+ "eqmCbClkInterfaceAlarm" ->
+ Sender;
+ "eqmCbClkVelocityAlarm" ->
+ Sender;
+ "eqmCbClkPhaseDiffAlarm" ->
+ Sender;
+ "eqmHwNotFoundAlarm" ->
+ Sender;
+ "eqmPduAlarm" ->
+ Sender;
+ "eqmFanAlarm" ->
+ Sender;
+ "eqmLocAlarm" ->
+ Sender;
+ "eqmCustomerDefined1Alarm" ->
+ Sender;
+ "eqmCustomerDefined2Alarm" ->
+ Sender;
+ "eqmCustomerDefined3Alarm" ->
+ Sender;
+ "eqmCustomerDefined4Alarm" ->
+ Sender;
+ "eqmOperatorBlockedLinkAlarm" ->
+ Sender;
+ "eqmPowerFilterAlarm" ->
+ Sender;
+ "eqmCbAbrAlarm" ->
+ Sender;
+ "eqmAlarmCutOffAlarm" ->
+ Sender;
+ OtherAlarm ->
+ Sender
+ end,
+
+ %% The testHeap instruction generated here will move up to before
+ %% the case.
+
+ bar:foo("<TABLE>
+ <TR><TD ALIGN=LEFT>Fault id:
+ <TD>" ++ FaultId ++ "
+ <TR><TD ALIGN=LEFT>Name:
+ <TD>" ++ Name ++ "
+ <TR><TD ALIGN=LEFT>Sender:
+ <TD>" ++ SenderLink ++ "
+ <TR><TD ALIGN=LEFT>Class:
+ <TD>" ++ Type ++ "
+ <TR><TD ALIGN=LEFT>Cause:
+ <TD>" ++ Cause ++ "
+ <TR><TD ALIGN=LEFT>Severity:
+ <TD>" ++ Severity ++ "
+ <TR><TD ALIGN=LEFT>Information:
+ <TD>" ++ Info ++ "
+ <TR><TD ALIGN=LEFT>Time:
+ <TD>" ++ Time).
diff --git a/lib/compiler/test/compilation_SUITE_data/beam_compiler_5.erl b/lib/compiler/test/compilation_SUITE_data/beam_compiler_5.erl
new file mode 100644
index 0000000000..a23a0d518c
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/beam_compiler_5.erl
@@ -0,0 +1,28 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(beam_compiler_5).
+-export([beam_compiler_5/0]).
+
+-compile(export_all).
+
+beam_compiler_5() ->
+ ok.
+
+t() ->
+ [_|_] = x.
diff --git a/lib/compiler/test/compilation_SUITE_data/beam_compiler_6.erl b/lib/compiler/test/compilation_SUITE_data/beam_compiler_6.erl
new file mode 100644
index 0000000000..f263fd75b2
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/beam_compiler_6.erl
@@ -0,0 +1,153 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(beam_compiler_6).
+-export([beam_compiler_6/0]).
+
+%% From Ulf Wiger, modified by Bjorn Gustavsson to provoke the
+%% same error with partly corrected compiler in P3A.
+
+beam_compiler_6() ->
+ ok.
+
+selected_alarm(_Env, Parameters) ->
+ UnWebParam = x,
+ [Time, Severity, Info, Cause,
+ Type, Sender, Name, FaultId] = bar:foo(),
+
+ %% Each branch of the case needs two words of heap,
+ %% but the test heap generated before the call to bar:foo(),
+ %% will be merged to the testHeap of each branch, summed and
+ %% moved before the branch. And the number of words to allocate
+ %% will be ridiculously big (> 65535) and will not fit in a
+ %% 16 bit word.
+
+ SenderLink =
+ case Name of
+ "pchScheduledConnectionAlarm" ->
+ [Sender];
+ "pchVpVcAlarm" ->
+ [Sender];
+ "pchSystemMemoryAlarm" ->
+ [Sender];
+ "uniProtocolRestartFailureAlarm" ->
+ [Sender];
+ "spvcScheduledConnectionAlarm" ->
+ [Sender];
+ "eqmSwitchCoreInterfaceAlarm" ->
+ [Sender];
+ "atmPhysicalLayerAlarm" ->
+ [Sender];
+ "atmBufferCongestionAlarm" ->
+ [Sender];
+ "sdhLinkAlarm" ->
+ [Sender];
+ "sdhFarEndAlarm" ->
+ [Sender];
+ "sdhUpperQosAlarm" ->
+ [Sender];
+ "sdhLowerQosAlarm" ->
+ [Sender];
+ "eqmSwitchCoreAlarm" ->
+ [Sender];
+ "eqmEtAlarm" ->
+ [Sender];
+ "eqmHwIdentityFaultAlarm" ->
+ [Sender];
+ "eqmOperatorBlockedEquipmentAlarm" ->
+ [Sender];
+ "pdh34PathAlarm" ->
+ [Sender];
+ "pdh34ObservationAlarm" ->
+ [Sender];
+ "pdh34UpperQosAlarm" ->
+ [Sender];
+ "pdh34LowerQosAlarm" ->
+ [Sender];
+ "nsySynchRefAlarm" ->
+ [Sender];
+ "nsySynchRefBlockedAlarm" ->
+ [Sender];
+ "nsySynchNodeHoldoverAlarm" ->
+ [Sender];
+ "nsySynchNodeNotWorkingAlarm" ->
+ [Sender];
+ "eqmAtbAlarm" ->
+ [Sender];
+ "eqmCbEtAlarm" ->
+ [Sender];
+ "eqmCpAlarm" ->
+ [Sender];
+ "eqmCpInterfaceAlarm" ->
+ [Sender];
+ "eqmCbClkAlarm" ->
+ [Sender];
+ "eqmCbClkInterfaceAlarm" ->
+ [Sender];
+ "eqmCbClkVelocityAlarm" ->
+ [Sender];
+ "eqmCbClkPhaseDiffAlarm" ->
+ [Sender];
+ "eqmHwNotFoundAlarm" ->
+ [Sender];
+ "eqmPduAlarm" ->
+ [Sender];
+ "eqmFanAlarm" ->
+ [Sender];
+ "eqmLocAlarm" ->
+ [Sender];
+ "eqmCustomerDefined1Alarm" ->
+ [Sender];
+ "eqmCustomerDefined2Alarm" ->
+ [Sender];
+ "eqmCustomerDefined3Alarm" ->
+ [Sender];
+ "eqmCustomerDefined4Alarm" ->
+ [Sender];
+ "eqmOperatorBlockedLinkAlarm" ->
+ [Sender];
+ "eqmPowerFilterAlarm" ->
+ [Sender];
+ "eqmCbAbrAlarm" ->
+ [Sender];
+ "eqmAlarmCutOffAlarm" ->
+ [Sender];
+ OtherAlarm ->
+ [Sender]
+ end,
+
+ %% The testHeap instruction generated here will move up to before
+ %% the case.
+
+ bar:foo("<TABLE>
+ <TR><TD ALIGN=LEFT>Fault id:
+ <TD>" ++ FaultId ++ "
+ <TR><TD ALIGN=LEFT>Name:
+ <TD>" ++ Name ++ "
+ <TR><TD ALIGN=LEFT>Sender:
+ <TD>" ++ SenderLink ++ "
+ <TR><TD ALIGN=LEFT>Class:
+ <TD>" ++ Type ++ "
+ <TR><TD ALIGN=LEFT>Cause:
+ <TD>" ++ Cause ++ "
+ <TR><TD ALIGN=LEFT>Severity:
+ <TD>" ++ Severity ++ "
+ <TR><TD ALIGN=LEFT>Information:
+ <TD>" ++ Info ++ "
+ <TR><TD ALIGN=LEFT>Time:
+ <TD>" ++ Time).
diff --git a/lib/compiler/test/compilation_SUITE_data/beam_compiler_8.erl b/lib/compiler/test/compilation_SUITE_data/beam_compiler_8.erl
new file mode 100644
index 0000000000..f1f4839798
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/beam_compiler_8.erl
@@ -0,0 +1,31 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1999-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(beam_compiler_8).
+
+-compile(export_all).
+
+beam_compiler_8() ->
+ ok.
+
+t(Key, Me) ->
+ Fun = fun(X) ->
+ me_rec:key_values(X, Key) < me_rec:key_values(Me, Key)
+ end.
+
+
diff --git a/lib/compiler/test/compilation_SUITE_data/beam_compiler_9.erl b/lib/compiler/test/compilation_SUITE_data/beam_compiler_9.erl
new file mode 100644
index 0000000000..581b908753
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/beam_compiler_9.erl
@@ -0,0 +1,67 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1999-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(beam_compiler_9).
+
+-export([compile/2, test/0, ?MODULE/0]).
+
+?MODULE() ->
+ ok.
+
+test() ->
+ Failures = failures(),
+ compile_files([hd(Failures)]).
+
+compile_files([File | Files]) ->
+ Pid = spawn(?MODULE, compile, [File, self()]),
+ Time = infinity,
+ receive
+ done ->
+ compile_files(Files)
+ after
+ Time ->
+ io:fwrite("Compilation not completed within ~w ms~n", [Time]),
+ exit(Pid, die),
+ compile_files(Files)
+ end;
+
+compile_files([]) ->
+ done.
+
+
+
+compile(File, Parent) ->
+ io:fwrite("Compiling: ~s~n", [File]),
+ statistics(runtime),
+ statistics(wall_clock),
+ statistics(reductions),
+ Result = c:c(File),
+ {_, Rslc} = statistics(runtime),
+ {_, Tslc} = statistics(wall_clock),
+ {_, Reds} = statistics(reductions),
+ io:fwrite("Result: ~w~n", [Result]),
+ io:fwrite("Reductions: ~w~n", [Reds]),
+ io:fwrite("Time: ~w~n", [Tslc]),
+ io:fwrite("Cpu time: ~w~n", [Rslc]),
+ io:nl(),
+ Parent ! done.
+
+
+
+failures() ->
+ [test].
diff --git a/lib/compiler/test/compilation_SUITE_data/bin_syntax_1.erl b/lib/compiler/test/compilation_SUITE_data/bin_syntax_1.erl
new file mode 100644
index 0000000000..7df1543d83
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/bin_syntax_1.erl
@@ -0,0 +1,31 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2000-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(bin_syntax_1).
+
+-export([f/2,?MODULE/0]).
+
+?MODULE() ->
+ ok.
+
+f(X, Y) ->
+ case X of
+ a ->
+ Y2 = 8
+ end,
+ <<5:Y2>> = Y.
diff --git a/lib/compiler/test/compilation_SUITE_data/bin_syntax_2.erl b/lib/compiler/test/compilation_SUITE_data/bin_syntax_2.erl
new file mode 100644
index 0000000000..dcf7b0f8bd
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/bin_syntax_2.erl
@@ -0,0 +1,41 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2000-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(bin_syntax_2).
+
+-export([?MODULE/0]).
+
+%% This module tests that constant propagation is done properly.
+
+?MODULE() ->
+ 258 = b(<<1,2>>),
+ F = c(),
+ 259 = F(<<1,3>>),
+ ok.
+
+b(B) ->
+ Sz = 16,
+ <<X:Sz/integer>> = B,
+ X.
+
+c() ->
+ Size = 16,
+ fun(Bin) ->
+ <<X:Size/integer>> = Bin,
+ X
+ end.
diff --git a/lib/compiler/test/compilation_SUITE_data/bin_syntax_3.erl b/lib/compiler/test/compilation_SUITE_data/bin_syntax_3.erl
new file mode 100644
index 0000000000..93d35d5628
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/bin_syntax_3.erl
@@ -0,0 +1,35 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2000-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(bin_syntax_3).
+-export([?MODULE/0,decode_integer/3]).
+
+?MODULE() ->
+ ok.
+
+decode_integer(Len, <<B1:1,B2:7,Bs/binary>>, RemovedBytes) when B1 == 0 ->
+ Bin = <<Skip:Len/unit:8, Buffer2/binary>> = <<B1:1,B2:7,Bs/binary>>,
+ Size = size(Bin),
+ <<Int:Size/unit:8>> = Bin,
+ {Int,Buffer2,RemovedBytes};
+decode_integer(Len,<<B1:1,B2:7,Bs/binary>>,RemovedBytes) ->
+ Bin = <<Skip:Len/unit:8,Buffer2/binary>> = <<B1:1,B2:7,Bs/binary>>,
+ Size = size(Bin),
+ <<N:Size/unit:8>> = <<B2,Bs/binary>>,
+ Int = N - (1 bsl (8 * size(Bin) -1)),
+ {Int,Buffer2,RemovedBytes}.
diff --git a/lib/compiler/test/compilation_SUITE_data/bin_syntax_4.erl b/lib/compiler/test/compilation_SUITE_data/bin_syntax_4.erl
new file mode 100644
index 0000000000..fe0ce80270
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/bin_syntax_4.erl
@@ -0,0 +1,32 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2000-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(bin_syntax_4).
+-export([?MODULE/0,f4b/2,f4c/2]).
+
+?MODULE() ->
+ ok.
+
+f4b(X, Y) ->
+ fun (<< A:Y >>, Y, B) -> fum(A, X, Y, B) end.
+
+f4c(X, Y) ->
+ fun (Y, << A:Y >>, B) -> fum(A, X, Y, B) end.
+
+fum(A, B, C, D) ->
+ {A,B,C,D}.
diff --git a/lib/compiler/test/compilation_SUITE_data/bin_syntax_6.erl b/lib/compiler/test/compilation_SUITE_data/bin_syntax_6.erl
new file mode 100644
index 0000000000..8de3a9094f
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/bin_syntax_6.erl
@@ -0,0 +1,39 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2005-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(bin_syntax_6).
+-export([?MODULE/0,x/1,y/1]).
+
+?MODULE() ->
+ ok.
+
+x(X) ->
+ blurf(),
+ B = {X,"OK",<<>>},
+ catch b({a,B}).
+
+y(X) ->
+ blurf(),
+ B = {X,"OK",<<42>>},
+ catch b({a,B}).
+
+blurf() ->
+ ok.
+
+b(_) ->
+ ok.
diff --git a/lib/compiler/test/compilation_SUITE_data/catch_in_catch.erl b/lib/compiler/test/compilation_SUITE_data/catch_in_catch.erl
new file mode 100644
index 0000000000..c732a912f0
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/catch_in_catch.erl
@@ -0,0 +1,51 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2003-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(catch_in_catch).
+
+-export([?MODULE/0,do_start/1]).
+
+?MODULE() ->
+ process_flag(trap_exit, true),
+ Pid = spawn_link(?MODULE, do_start, [x]),
+ receive
+ {'EXIT',Pid,good_exit} -> ok;
+ Other ->
+ io:format("Unexpected: ~p\n", [Other]),
+ error
+ after 32000 ->
+ io:format("No message received\n"),
+ error
+ end.
+
+do_start(Param) ->
+ init(Param),
+ exit(good_exit).
+
+init(Param) ->
+ process_flag(trap_exit, true),
+ %% The catches were improperly nested, causing a "No catch found" crash.
+ (catch begin
+ foo(Param),
+ (catch exit(bar))
+ end
+ ),
+ ignore.
+
+foo(_) ->
+ ok.
diff --git a/lib/compiler/test/compilation_SUITE_data/compiler_1.erl b/lib/compiler/test/compilation_SUITE_data/compiler_1.erl
new file mode 100644
index 0000000000..6dbd80d962
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/compiler_1.erl
@@ -0,0 +1,742 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(compiler_1).
+-compile([export_all]).
+
+compiler_1() -> ok.
+
+-define(log(Format,Args),mnesia_test_lib:log(Format,Args,?FILE,?LINE)).
+-define(warning(Format,Args),?log("<WARNING> " ++ Format,Args)).
+-define(error(Format,Args),
+ mnesia_test_lib:note_error(Format,Args,?FILE,?LINE),
+ ?log("<ERROR> " ++ Format,Args)).
+
+-define(match(ExpectedRes,Expr),
+ fun() ->
+ AcTuAlReS = (catch (Expr)),
+ case AcTuAlReS of
+ ExpectedRes ->
+ ?log("ok, result as expected: ~p~n",[AcTuAlReS]),
+ {success,AcTuAlReS};
+ _ ->
+ ?error("actual result was: ~p~n",[AcTuAlReS]),
+ {fail,AcTuAlReS}
+ end
+ end()).
+
+-define(match_inverse(NotExpectedRes,Expr),
+ fun() ->
+ AcTuAlReS = (catch (Expr)),
+ case AcTuAlReS of
+ NotExpectedRes ->
+ ?error("actual result was: ~p~n",[AcTuAlReS]),
+ {fail,AcTuAlReS};
+ _ ->
+ ?log("ok, result as expected: ~p~n",[AcTuAlReS]),
+ {success,AcTuAlReS}
+ end
+ end()).
+
+-define(match_receive(ExpectedMsg),
+ ?match(ExpectedMsg,mnesia_test_lib:pick_msg())).
+
+%% ExpectedMsgs must be completely bound
+-define(match_multi_receive(ExpectedMsgs),
+ fun() ->
+ TmPeXpCtEdMsGs = lists:sort(ExpectedMsgs),
+ ?match(TmPeXpCtEdMsGs,
+ lists:sort(lists:map(fun(_) ->
+ mnesia_test_lib:pick_msg()
+ end,
+ TmPeXpCtEdMsGs)))
+ end()).
+
+-define(setup(), mnesia_test_lib:setup(?FILE,?LINE)).
+
+-define(start_activities(Nodes),
+ fun() ->
+ AcTiViTyPiDs =
+ lists:map(fun(Node) ->
+ spawn_link(Node,
+ mnesia_test_lib,
+ activity_evaluator,
+ [self()])
+ end,
+ Nodes),
+ ?match_multi_receive(AcTiViTyPiDs)
+ end()).
+
+-define(start_transactions(Pids),
+ ?match_multi_receive(lists:map(fun(Pid) ->
+ Pid ! begin_trans,
+ {Pid,begin_trans}
+ end,
+ Pids))).
+
+-define(acquire_nodes(N,Nodes),
+ mnesia_test_lib:acquire_nodes(N,Nodes,?FILE,?LINE)).
+
+
+
+%%% Copyright (C) 1996, Ellemtel Telecommunications Systems Laboratories
+%%% Author: Hakan Mattsson [email protected]
+%%% Purpose: Evil usage of the API
+%%%
+%%% Invoke all functions in the API and try to cover all legal uses
+%%% cases as well the illegal dito. This is a complement to the
+%%% other more explicit test cases.
+%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%
+%%% show/0
+%%%
+%%% Prints out the complete test case structure
+%%%
+%%% show/1
+%%%
+%%% Prints out parts of the test case structure
+%%%
+%%% test/0
+%%%
+%%% Run the complete test suite.
+%%% Reads Nodes from nodes.profile and starts them if neccessary.
+%%% Kills Mnesia and wipes out the Mnesia directories as a starter.
+%%%
+%%% test/1
+%%%
+%%% Run parts of the test suite.
+%%% Reads Nodes from nodes.profile and starts them if neccessary.
+%%% Kills Mnesia and wipes out the Mnesia directories as a starter.
+%%%
+%%% test/2
+%%%
+%%% Run parts of the test suite on the given Nodes,
+%%% assuming that the nodes are up and running.
+%%% Kills Mnesia and wipes out the Mnesia directories as a starter.
+%%%
+%%% test/3
+%%%
+%%% Run parts of the test suite on permutations of the given Nodes,
+%%% assuming that the nodes are up and running. Uses test/2.
+%%% Kills Mnesia and wipes out the Mnesia directories as a starter.
+%%%
+%%% See the module mnesia_test_lib for further information.
+%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+show() -> mnesia_test_lib:show([{?MODULE,all}]).
+show(TestCases) -> mnesia_test_lib:show([{?MODULE,TestCases}]).
+test() -> mnesia_test_lib:test([{?MODULE,all}]).
+test(TestCases) -> mnesia_test_lib:test([{?MODULE,TestCases}]).
+test(TestCases,Nodes) -> mnesia_test_lib:test([{?MODULE,TestCases}],Nodes).
+test(TestCases,Nodes,Config) -> mnesia_test_lib:test([{?MODULE,TestCases}],Nodes,Config).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+old_all(suite) ->
+ [
+ system_info, table_info, error_description,
+ db_node_lifecycle, start_and_stop, transaction, checkpoint, backup,
+ table_lifecycle, replica_management, replica_location, index_lifecycle,
+ trans_access, dirty_access, table_sync, snmp_access, debug_support
+ ].
+
+trans_access(suite) ->
+ [ {mnesia_dirty_access_test,all} ].
+
+dirty_access(suite) ->
+ [ {mnesia_trans_access_test,all} ].
+
+%% Get meta info about Mnesia
+system_info(suite) -> [];
+system_info(Nodes) ->
+ ?match(yes,mnesia:system_info(is_running)),
+ ?match(Nodes,mnesia:system_info(db_nodes)),
+ ?match(Nodes,mnesia:system_info(running_db_nodes)),
+ ?match(true,mnesia:system_info(have_disc)),
+ ?match(A when atom(A),mnesia:system_info(debug)),
+ ?match(L when list(L),mnesia:system_info(directory)),
+ ?match(L when list(L),mnesia:system_info(log_version)),
+ ?match({_,_},mnesia:system_info(schema_version)),
+ ?match(L when list(L),mnesia:system_info(tables)),
+ ?match(L when list(L),mnesia:system_info(local_tables)),
+ ?match(L when list(L),mnesia:system_info(held_locks)),
+ ?match(L when list(L),mnesia:system_info(lock_queue)),
+ ?match(L when list(L),mnesia:system_info(transactions)),
+ ?match(I when integer(I),mnesia:system_info(transaction_failures)),
+ ?match(I when integer(I),mnesia:system_info(transaction_commits)),
+ ?match(I when integer(I),mnesia:system_info(transaction_restarts)),
+ ?match(L when list(L),mnesia:system_info(checkpoints)),
+ ?match(A when atom(A),mnesia:system_info(backup_module)),
+ ?match(true,mnesia:system_info(auto_repair)),
+ ?match({_,_},mnesia:system_info(dump_log_interval)),
+ ?match(A when atom(A),mnesia:system_info(dump_log_update_in_place)),
+ ?match(I when integer(I),mnesia:system_info(transaction_log_writes)),
+ ?match({'EXIT',{aborted,badarg}},mnesia:system_info(ali_baba)),
+ done.
+
+%% Get meta info about table
+table_info(suite) -> [];
+table_info(Nodes) ->
+ [Node1,Node2,Node3] = ?acquire_nodes(3,Nodes),
+
+ Tab = table_info,
+ Type = bag,
+ ValPos = 3,
+ Attrs = [k,v],
+ Arity = length(Attrs) +1,
+ Schema = [{name,Tab},{type,Type},{attributes,Attrs},{index,[ValPos]},
+ {disc_only_copies,[Node1]},{ram_copies,[Node2]},{disc_copies,[Node3]}],
+ ?match({atomic,ok}, mnesia:create_table(Schema)),
+
+ Size = 10,
+ Keys = lists:seq(1,Size),
+ Records = [{Tab,A,7} || A <- Keys],
+ lists:foreach(fun(Rec) -> ?match(ok,mnesia:dirty_write(Rec)) end,Records),
+ ?match(Mem when integer(Mem),mnesia:table_info(Tab,memory)),
+ ?match(Size,mnesia:table_info(Tab,size)),
+ ?match(Type,mnesia:table_info(Tab,type)),
+ ?match([Node3],mnesia:table_info(Tab,disc_copies)),
+ ?match([Node2],mnesia:table_info(Tab,ram_copies)),
+ ?match([Node1],mnesia:table_info(Tab,disc_only_copies)),
+ Read = [Node1,Node2,Node3],
+ ?match(true,lists:member(mnesia:table_info(Tab,where_to_read),Read)),
+ Write = lists:sort([Node1,Node2,Node3]),
+ ?match(Write,lists:sort(mnesia:table_info(Tab,where_to_write))),
+ WriteLock = lists:sort([Node2,Node3]),
+ ?match([ValPos],mnesia:table_info(Tab,index)),
+ ?match(Arity,mnesia:table_info(Tab,arity)),
+ ?match(Attrs,mnesia:table_info(Tab,attributes)),
+ ?match({Tab,'_','_'},mnesia:table_info(Tab,wild_pattern)),
+ ?match({atomic,Attrs}, mnesia:transaction(fun() ->
+ mnesia:table_info(Tab,attributes) end)),
+
+ done.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Add and drop db nodes
+
+db_node_lifecycle(suite) -> [];
+db_node_lifecycle(Nodes) ->
+ [Node1,Node2] = ?acquire_nodes(2,Nodes),
+ Tab = db_node_lifecycle,
+
+ Schema = [{name,Tab},{ram_copies,[Node1,Node2]}],
+ ?match({atomic,ok}, mnesia:create_table(Schema)),
+ ?match({aborted,active}, rpc:call(Node1,mnesia,del_db_node,[Node2])),
+
+ ?match([], mnesia_test_lib:stop_mnesia(Nodes)),
+ ?match(ok, mnesia:delete_schema(Nodes)),
+ ?match({error,_}, mnesia:create_schema(foo)),
+ ?match({error,_}, mnesia:create_schema([foo])),
+ ?match({error,_}, mnesia:create_schema([foo@bar])),
+ ?match({error,_}, mnesia:start()),
+
+ ?match(ok, mnesia:create_schema(Nodes)),
+ ?match([],mnesia_test_lib:start_mnesia(Nodes)),
+ ?match({atomic,ok}, rpc:call(Node1,mnesia,del_db_node,[Node2])),
+ ?match({aborted,no_exists}, rpc:call(Node1,mnesia,del_db_node,[Node2])),
+ ?match({aborted,no_exists}, rpc:call(Node1,mnesia,del_db_node,[foo])),
+ ?match({aborted,no_exists}, rpc:call(Node1,mnesia,del_db_node,[foo@bar])),
+
+ ?match([], mnesia_test_lib:stop_mnesia([Node2])),
+ ?match(ok,mnesia:delete_schema([Node2])),
+ AddFun = fun() -> ?match({aborted,nested_transaction},
+ mnesia:add_db_node(Node2)), ok end,
+ ?match({atomic,ok},rpc:call(Node1,mnesia,transaction,[AddFun])),
+ DelFun = fun() -> ?match({aborted,nested_transaction},
+ mnesia:del_db_node(Node2)), ok end,
+ ?match({atomic,ok},rpc:call(Node1,mnesia,transaction,[DelFun])),
+
+ ?match({atomic,ok}, rpc:call(Node1,mnesia,add_db_node,[Node2])),
+ ?match({aborted,already_exists}, rpc:call(Node1,mnesia,add_db_node,[Node2])),
+ ?match([],mnesia_test_lib:start_mnesia([Node2])),
+ ?match({atomic,ok}, mnesia:create_table(Schema)),
+ done.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Start and stop the system
+
+start_and_stop(suite) -> [];
+start_and_stop(Nodes) ->
+ [Node1] = ?acquire_nodes(1,Nodes),
+
+ ?match(stopped, rpc:call(Node1,mnesia,stop,[])),
+ ?match(stopped, rpc:call(Node1,mnesia,stop,[])),
+ ?match({started,_}, rpc:call(Node1,mnesia,start,[])),
+ ?match({started,_}, rpc:call(Node1,mnesia,start,[])),
+ ?match(stopped, rpc:call(Node1,mnesia,stop,[])),
+ ?match([],mnesia_test_lib:start_mnesia(Nodes)),
+ done.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Checkpoints and backup management
+
+checkpoint(suite) -> [];
+checkpoint(Nodes) ->
+ OneNode = ?acquire_nodes(1,Nodes),
+ checkpoint(OneNode,Nodes),
+ TwoNodes = ?acquire_nodes(2,Nodes),
+ checkpoint(TwoNodes,Nodes).
+
+checkpoint(TabNodes,Nodes) ->
+ [Node1] = ?acquire_nodes(1,TabNodes),
+ CreateTab = fun(Type,N,Ns) ->
+ Tab0 = lists:concat(["local_checkpoint_",Type,N]),
+ Tab = list_to_atom(Tab0),
+ Schema = [{name,Tab},{Type,Ns}],
+ ?match({atomic,ok},mnesia:delete_table(Tab)),
+ ?match({atomic,ok},mnesia:create_table(Schema)),
+ Tab
+ end,
+ CreateTabs = fun(Type) ->
+ CreateTab(Type,1,hd(TabNodes)),
+ CreateTab(Type,2,TabNodes),
+ CreateTab(Type,3,lists:last(TabNodes))
+ end,
+ Types = [ram_copies,disc_copies,disc_only_copies],
+ Tabs = lists:append(lists:map(CreateTabs,Types)),
+ Recs = lists:sort([{T,N,N} || T <- Tabs,N <- lists:seq(1,10)]),
+ lists:foreach(fun(R) -> ?match(ok,mnesia:dirty_write(R)) end,Recs),
+
+ CpName = a_checkpoint_name,
+ MinArgs = [{name,CpName},{min,Tabs},{allow_remote,false}],
+ ?match({ok,CpName,[Node1]},
+ rpc:call(Node1,mnesia,activate_checkpoint,[MinArgs])),
+ ?match(ok,rpc:call(Node1,mnesia,deactivate_checkpoint,[CpName])),
+
+ MaxArgs = [{name,CpName},{max,Tabs},{allow_remote,true}],
+ ?match({ok,CpName,[Node1]},
+ rpc:call(Node1,mnesia,activate_checkpoint,[MaxArgs])),
+ ?match(ok,rpc:call(Node1,mnesia,deactivate_checkpoint,[CpName])),
+
+ Args = [{name,CpName},{min,Tabs},{allow_remote,false}],
+ ?match({ok,CpName,[Node1]},
+ rpc:call(Node1,mnesia,activate_checkpoint,[Args])),
+ Recs2 = lists:sort([{T,K,0} || {T,K,_} <- Recs]),
+ lists:foreach(fun(R) -> ?match(ok,mnesia:dirty_write(R)) end,Recs2),
+ ?match({atomic,ok},rpc:call(Node1,mnesia,deactivate_checkpoint,[CpName])),
+
+ ?match({error,no_exists},mnesia:deactivate_checkpoint(CpName)),
+ ?match({error,badarg},mnesia:activate_checkpoint(foo)),
+ ?match({error,badarg},mnesia:activate_checkpoint([{foo,foo}])),
+ ?match({error,badarg},mnesia:activate_checkpoint([{max,foo}])),
+ ?match({error,badarg},mnesia:activate_checkpoint([{min,foo}])),
+ ?match({error,no_exists},mnesia:activate_checkpoint([{min,[foo@bar]}])),
+ ?match({error,badarg},mnesia:activate_checkpoint([{allow_remote,foo}])),
+
+ Fun = fun(Tab) -> ?match({atomic,ok},mnesia:delete_table(Tab)) end,
+ lists:foreach(Fun,Tabs),
+ done.
+
+backup(suite) ->
+ [
+ backup_schema, restore_schema, backup_checkpoint, restore_tables
+ ].
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Use and misuse transactions
+
+transaction(suite) -> [];
+transaction(Nodes) ->
+ [Node1] = ?acquire_nodes(1,Nodes),
+ ?match({atomic,ali_baba}, mnesia:transaction(fun() -> ali_baba end)),
+ ?match({aborted,_}, mnesia:transaction(no_fun)),
+ ?match({aborted,_}, mnesia:transaction(?MODULE,no_fun,[foo])),
+
+ {success,[A,B,C,D,E,F,G,H]} = ?start_activities(lists:duplicate(8,Node1)),
+ ?start_transactions([A,B,C,D,E,F,G,H]),
+
+ A ! fun() -> mnesia:abort(abort_bad_trans) end,
+ ?match_receive({A,{aborted,abort_bad_trans}}),
+
+ B ! fun() -> 1 = 2 end,
+ ?match_receive({B,{aborted,_}}),
+
+ C ! fun() -> throw(throw_bad_trans) end,
+ ?match_receive({C,{aborted,{throw,throw_bad_trans}}}),
+
+ D ! fun() -> exit(exit_bad_trans) end,
+ ?match_receive({D,{aborted,exit_bad_trans}}),
+
+ E ! fun() -> exit(normal) end,
+ ?match_receive({E,{aborted,normal}}),
+
+ F ! fun() -> exit(abnormal) end,
+ ?match_receive({F,{aborted,abnormal}}),
+
+ G ! fun() -> exit(G,abnormal) end,
+ ?match_receive({'EXIT',G,abnormal}),
+
+ H ! fun() -> exit(H,kill) end,
+ ?match_receive({'EXIT',H,killed}),
+
+ ?match({atomic,ali_baba},
+ mnesia:transaction(fun() -> ali_baba end,infinity)),
+ ?match({atomic,ali_baba},mnesia:transaction(fun() -> ali_baba end,1)),
+ ?match({atomic,ali_baba},mnesia:transaction(fun() -> ali_baba end,0)),
+ ?match({atomic,ali_baba},mnesia:transaction(fun() -> ali_baba end,-1)),
+ ?match({atomic,ali_baba},mnesia:transaction(fun() -> ali_baba end,foo)),
+ Fun = fun() -> ?match({aborted,nested_transaction},
+ mnesia:transaction(fun() -> ok end)), ok end,
+ ?match({atomic,ok},mnesia:transaction(Fun)),
+ done.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Create and delete tables
+
+%% Get meta info about table
+
+replica_location(suite) -> [];
+replica_location(Nodes) ->
+ [Node1,Node2,Node3] = ?acquire_nodes(3,Nodes),
+ Tab = replica_location,
+
+ %% Create three replicas
+ Schema = [{name,Tab},{disc_only_copies,[Node1]},
+ {ram_copies,[Node2]},{disc_copies,[Node3]}],
+ ?match({atomic,ok}, mnesia:create_table(Schema)),
+ mnesia_test_lib:verify_replica_location(Tab,[Node1],[Node2],[Node3],Nodes),
+
+ %% Delete one replica
+ ?match({atomic,ok}, mnesia:del_table_copy(Tab, Node2)),
+ mnesia_test_lib:verify_replica_location(Tab,[Node1],[],[Node3],Nodes),
+
+ %% Move one replica
+ ?match({atomic,ok}, mnesia:move_table_copy(Tab, Node1, Node2)),
+ mnesia_test_lib:verify_replica_location(Tab,[Node2],[],[Node3],Nodes),
+
+ %% Change replica type
+ ?match({atomic,ok}, mnesia:change_table_copy_type(Tab, Node2,ram_copies)),
+ mnesia_test_lib:verify_replica_location(Tab,[],[Node2],[Node3],Nodes),
+
+ done.
+
+table_lifecycle(suite) -> [];
+table_lifecycle(Nodes) ->
+ [Node1,Node2] = ?acquire_nodes(2,Nodes),
+
+ ?match({atomic,ok}, mnesia:create_table([{type,bag},
+ {ram_copies,[Node1]},
+ {attributes,[rajtan,tajtan]},
+ {name,order_of_args}])),
+ ?match([],mnesia:dirty_read({order_of_args,4711})),
+ ?match({atomic,ok}, mnesia:create_table([{name,already_exists},
+ {ram_copies,[Node1]}])),
+ ?match({aborted,already_exists},
+ mnesia:create_table([{name,already_exists},{ram_copies,[Node1]}])),
+ ?match({aborted,not_a_db_node},
+ mnesia:create_table([{name,no_node},{ram_copies,[foo]}])),
+ ?match({aborted,not_a_db_node},
+ mnesia:create_table([{name,no_host},{ram_copies,[foo@bar]}])),
+ ?match({aborted,badarg},
+ mnesia:create_table([{name,zero_arity},{attributes,[]}])),
+ ?match({aborted,badarg}, mnesia:create_table([])),
+ ?match({aborted,badarg}, mnesia:create_table(atom)),
+ ?match({aborted,badarg},
+ mnesia:create_table({cstruct,table_name_as_atom})),
+ ?match({aborted,bad_type},
+ mnesia:create_table([{name,no_host},{ram_copies,foo}])),
+ ?match({aborted,bad_type},
+ mnesia:create_table([{name,no_host},{disc_only_copies,foo}])),
+ ?match({aborted,bad_type},
+ mnesia:create_table([{name,no_host},{disc_copies,foo}])),
+
+ CreateFun =
+ fun() -> ?match({aborted,nested_transaction},
+ mnesia:create_table([{name,nested_trans}])), ok
+ end,
+ ?match({atomic,ok},mnesia:transaction(CreateFun)),
+ ?match({atomic,ok},mnesia:create_table([{name,remote_tab},
+ {ram_copies,[Node2]}])),
+
+ ?match({atomic,ok}, mnesia:create_table([{name,a_brand_new_tab},
+ {ram_copies,[Node1]}])),
+ ?match([],mnesia:dirty_read({a_brand_new_tab,4711})),
+ ?match({atomic,ok}, mnesia:delete_table(a_brand_new_tab)),
+ ?match({'EXIT',{aborted,no_exists}},
+ mnesia:dirty_read({a_brand_new_tab,4711})),
+ ?match({aborted,no_exists}, mnesia:delete_table(a_brand_new_tab)),
+ ?match({aborted,badarg}, mnesia:create_table([])),
+
+ ?match({atomic,ok}, mnesia:create_table([{name,nested_del_trans},
+ {ram_copies,[Node1]}])),
+ DeleteFun = fun() -> ?match({aborted,nested_transaction},
+ mnesia:delete_table(nested_del_trans)), ok end,
+ ?match({atomic,ok}, mnesia:transaction(DeleteFun)),
+
+ ?match({aborted,bad_type},
+ mnesia:create_table([{name,create_with_index},{index,2}])),
+ ?match({aborted,bad_index},
+ mnesia:create_table([{name,create_with_index},{index,[-1]}])),
+ ?match({aborted,bad_index},
+ mnesia:create_table([{name,create_with_index},{index,[0]}])),
+ ?match({aborted,bad_index},
+ mnesia:create_table([{name,create_with_index},{index,[1]}])),
+ ?match({aborted,bad_index},
+ mnesia:create_table([{name,create_with_index},{index,[2]}])),
+ ?match({atomic,ok},
+ mnesia:create_table([{name,create_with_index},{index,[3]},
+ {ram_copies,[Node1]}])),
+ done.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Add, drop and move replicas, change storage types
+%% Change table layout (only arity change supported)
+
+replica_management(suite) -> [];
+replica_management(Nodes) ->
+ %% add_table_copy/3, del_table_copy/2, move_table_copy/3,
+ %% change_table_copy_type/3, transform_table/3
+
+ [Node1,Node2,Node3] = ?acquire_nodes(3,Nodes),
+
+ Tab = replica_management,
+ Attrs = [k,v],
+
+ %%
+ %% Add, delete and change replicas
+ %%
+ ?match({atomic,ok},
+ mnesia:create_table([{name,Tab},{attributes,Attrs},
+ {ram_copies,[Node1]}])),
+ mnesia_test_lib:verify_replica_location(Tab,[],[Node1],[],Nodes),
+ %% R - -
+ ?match({aborted,combine_error},
+ mnesia:add_table_copy(Tab, Node2, disc_copies)),
+ ?match({aborted,combine_error},
+ mnesia:change_table_copy_type(Tab, Node1, disc_copies)),
+ ?match({atomic,ok}, mnesia:del_table_copy(Tab,Node1)),
+ mnesia_test_lib:verify_replica_location(Tab,[],[],[],Nodes),
+ %% - - -
+ ?match({aborted,no_exists},
+ mnesia:add_table_copy(Tab, Node3, ram_copies)),
+
+ ?match({atomic,ok}, mnesia:create_table([{name,Tab},
+ {attributes,Attrs},
+ {disc_copies,[Node1]}])),
+ mnesia_test_lib:verify_replica_location(Tab,[],[],[Node1],Nodes),
+ %% D - -
+ ?match({aborted,badarg},
+ mnesia:add_table_copy(Tab, Node2, bad_storage_type)),
+ ?match({atomic,ok}, mnesia:add_table_copy(Tab, Node2, disc_only_copies)),
+ mnesia_test_lib:verify_replica_location(Tab,[Node2],[],[Node1],Nodes),
+ %% D DO -
+ ?match({atomic,ok}, mnesia:add_table_copy(Tab, Node3, ram_copies)),
+ mnesia_test_lib:verify_replica_location(Tab,[Node2],[Node3],[Node1],Nodes),
+ %% D DO R
+ ?match({atomic,ok},
+ mnesia:change_table_copy_type(Tab, Node1, disc_only_copies)),
+ mnesia_test_lib:verify_replica_location(Tab,[Node1,Node2],[Node3],[],Nodes),
+ %% DO DO R
+ ?match({aborted,already_exists},
+ mnesia:add_table_copy(Tab, Node3, ram_copies)),
+ ?match({atomic,ok}, mnesia:del_table_copy(Tab, Node1)),
+ mnesia_test_lib:verify_replica_location(Tab,[Node2],[Node3],[],Nodes),
+ %% - DO R
+ ?match({aborted,_}, mnesia:del_table_copy(Tab, Node1)),
+ ?match({atomic,ok}, mnesia:add_table_copy(Tab, Node1, disc_copies)),
+ mnesia_test_lib:verify_replica_location(Tab,[Node2],[Node3],[Node1],Nodes),
+ %% D DO R
+ ?match({atomic,ok},
+ mnesia:change_table_copy_type(Tab, Node3, disc_only_copies)),
+ mnesia_test_lib:verify_replica_location(Tab,[Node2,Node3],[],[Node1],Nodes),
+ %% D DO DO
+ ?match({atomic,ok}, mnesia:del_table_copy(Tab, Node2)),
+ mnesia_test_lib:verify_replica_location(Tab,[Node3],[],[Node1],Nodes),
+ %% D - DO
+ ?match({aborted,already_exists},
+ mnesia:change_table_copy_type(Tab, Node1, disc_copies)),
+
+ %%
+ %% Move replica
+ %%
+ ?match({atomic,ok}, mnesia:move_table_copy(Tab,Node1,Node2)),
+ mnesia_test_lib:verify_replica_location(Tab,[Node3],[],[Node2],Nodes),
+ %% - D DO
+ ?match({aborted,_}, mnesia:move_table_copy(Tab,Node1,Node2)),
+ ?match([], mnesia_test_lib:stop_mnesia([Node3])),
+ mnesia_test_lib:verify_replica_location(Tab,[Node3],[],[Node2],
+ Nodes -- [Node3]),
+ %% - D DO
+ ?match({atomic,ok}, mnesia:move_table_copy(Tab,Node3,Node1)),
+ mnesia_test_lib:verify_replica_location(Tab,[Node1],[],[Node2],
+ Nodes -- [Node3]),
+ %% DO D -
+ ?match([],mnesia_test_lib:start_mnesia([Node3])),
+ mnesia_test_lib:verify_replica_location(Tab,[Node1],[],[Node2],Nodes),
+ %% DO D -
+
+ %%
+ %% Transformer
+ %%
+
+ NewAttrs = Attrs ++ [extra],
+ Transformer =
+ fun(Rec) -> list_to_tuple(tuple_to_list(Rec) ++ [initial_value]) end,
+ ?match({atomic,ok}, mnesia:transform_table(Tab, Transformer,NewAttrs)),
+ ?match({atomic,ok}, mnesia:transform_table(Tab, fun(R) -> R end, Attrs)),
+ ?match({aborted,bad_type}, mnesia:transform_table(Tab, Transformer, 0)),
+ ?match({aborted,bad_type}, mnesia:transform_table(Tab, Transformer, -1)),
+ ?match({aborted,badarg}, mnesia:transform_table(Tab, Transformer, [])),
+ ?match({aborted,bad_type}, mnesia:transform_table(Tab, no_fun, NewAttrs)),
+
+ NestedFun =
+ fun() ->
+ ?match({aborted,_},
+ mnesia:move_table_copy(Tab,Node1,Node2)),
+ ?match({aborted,_},
+ mnesia:add_table_copy(Tab,Node1,ram_copies)),
+ ?match({aborted,_},
+ mnesia:del_table_copy(Tab,Node1)),
+ T = fun(_) -> 4711 end,
+ ?match({aborted,_},
+ mnesia:transform_table(Tab,Transformer, T)),
+ ok
+ end,
+ ?match({atomic,ok},mnesia:transaction(NestedFun)),
+ done.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Add and drop indecies
+
+index_lifecycle(suite) ->
+ [ add_table_index, create_live_table_index, del_table_index ].
+
+%% Add table index
+
+add_table_index(suite) -> [];
+add_table_index(Nodes) ->
+ [Node1] = ?acquire_nodes(1,Nodes),
+ Tab = add_table_index,
+ Schema = [{name,Tab},{attributes,[k,v]},{ram_copies,[Node1]}],
+ ?match({atomic,ok}, mnesia:create_table(Schema)),
+ ValPos = 3,
+ BadValPos = ValPos + 1,
+ ?match({aborted,bad_index}, mnesia:add_table_index(Tab,BadValPos)),
+ ?match({aborted,bad_index}, mnesia:add_table_index(Tab,2)),
+ ?match({aborted,bad_index}, mnesia:add_table_index(Tab,1)),
+ ?match({aborted,bad_index}, mnesia:add_table_index(Tab,0)),
+ ?match({aborted,bad_index}, mnesia:add_table_index(Tab,-1)),
+ ?match({atomic,ok}, mnesia:add_table_index(Tab,ValPos)),
+ ?match({aborted,already_exists}, mnesia:add_table_index(Tab,ValPos)),
+
+ NestedFun = fun() ->
+ ?match({aborted,nested_transaction},
+ mnesia:add_table_index(Tab,ValPos)),
+
+ ok
+ end,
+ ?match({atomic,ok},mnesia:transaction(NestedFun)),
+ done.
+
+create_live_table_index(suite) -> [];
+create_live_table_index(Nodes) ->
+ [Node1] = ?acquire_nodes(1,Nodes),
+ Tab = create_live_table_index,
+ Schema = [{name,Tab},{attributes,[k,v]},{ram_copies,[Node1]}],
+ ?match({atomic,ok}, mnesia:create_table(Schema)),
+ ValPos = 3,
+ mnesia:dirty_write({Tab,1,2}),
+
+ Fun = fun() ->
+ ?match(ok, mnesia:write({Tab,2,2})),
+ ok
+ end,
+ ?match({atomic,ok},mnesia:transaction(Fun)),
+ ?match({atomic,ok}, mnesia:add_table_index(Tab,ValPos)),
+ done.
+
+%% Drop table index
+
+del_table_index(suite) ->[];
+del_table_index(Nodes) ->
+ [Node1] = ?acquire_nodes(1,Nodes),
+ Tab = del_table_index,
+ Schema = [{name,Tab},{attributes,[k,v]},{ram_copies,[Node1]}],
+ ?match({atomic,ok}, mnesia:create_table(Schema)),
+ ValPos = 3,
+ BadValPos = ValPos + 1,
+ ?match({atomic,ok}, mnesia:add_table_index(Tab,ValPos)),
+ ?match({aborted,no_exists},
+ mnesia:del_table_index(Tab,BadValPos)),
+ ?match({atomic,ok}, mnesia:del_table_index(Tab,ValPos)),
+
+ NestedFun =
+ fun() ->
+ ?match({aborted,nested_transaction},
+ mnesia:del_table_index(Tab,ValPos)),
+ ok
+ end,
+ ?match({atomic,ok},mnesia:transaction(NestedFun)),
+ done.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Syncronize table with log or disc
+%%
+table_sync(suite) ->
+ [ dump_tables, dump_log, change_dump_log_config, wait_for_tables, force_load_table ].
+
+%% Dump ram tables on disc
+dump_tables(suite) -> [];
+dump_tables(Nodes) ->
+ [Node1,Node2] = ?acquire_nodes(2,Nodes),
+ Tab = dump_tables,
+ Schema = [{name,Tab},{attributes,[k,v]},{ram_copies,[Node2]}],
+ ?match({atomic,ok}, mnesia:create_table(Schema)),
+
+ %% Dump 10 records
+ Size = 10,
+ Keys = lists:seq(1,Size),
+ Records = [{Tab,A,7} || A <- Keys],
+ lists:foreach(fun(Rec) -> ?match(ok,mnesia:dirty_write(Rec)) end,Records),
+ AllKeys = fun() -> lists:sort(mnesia:all_keys(Tab)) end,
+
+ ?match({atomic,Keys}, mnesia:transaction(AllKeys)),
+ ?match(ok, mnesia:dump_tables(Tab)),
+
+ %% Delete one record
+ ?match(ok,mnesia:dirty_delete({Tab,5})),
+ Keys2 = lists:delete(5,Keys),
+ ?match({atomic,Keys2}, mnesia:transaction(AllKeys)),
+
+ %% Check that all 10 is restored after a stop
+ ?match([], mnesia_test_lib:stop_mnesia([Node1,Node2])),
+ ?match([],mnesia_test_lib:start_mnesia([Node1,Node2])),
+ ?match(ok,mnesia:wait_for_tables([Tab],infinity)),
+ ?match({atomic,Keys}, mnesia:transaction(AllKeys)),
+
+ ?match(ok, mnesia:dump_tables([foo])),
+ done.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Make Mnesia table accessible via SNMP
+
+snmp_access(suite) ->
+ [
+ snmp_open_table, snmp_close_table,
+ snmp_get_row, snmp_get_next_index, snmp_get_mnesia_key
+ ].
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Check that the debug support has not decayed
+
+debug_support(suite) ->
+ [ info, schema, schema, kill, lkill ].
+
diff --git a/lib/compiler/test/compilation_SUITE_data/compiler_3.erl b/lib/compiler/test/compilation_SUITE_data/compiler_3.erl
new file mode 100644
index 0000000000..47891a22b5
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/compiler_3.erl
@@ -0,0 +1,33 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(compiler_3).
+-export([compiler_3/0]).
+-record(rec,{a}).
+
+compiler_3() ->
+ guard_record().
+
+guard_record() ->
+ 1=func(#rec{}),
+ {'EXIT',_} = (catch func({rec})),
+ ok.
+
+func(X) when record(X,
+rec) ->
+ 1.
diff --git a/lib/compiler/test/compilation_SUITE_data/compiler_5.erl b/lib/compiler/test/compilation_SUITE_data/compiler_5.erl
new file mode 100644
index 0000000000..c2a0c2064f
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/compiler_5.erl
@@ -0,0 +1,49 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(compiler_5).
+-export([compiler_5/0]).
+
+compiler_5() ->
+ f0(),
+ f1(),
+ f2(),
+ ok.
+
+%% compiler treats records with 1 and 2 fields differently...
+-record(nil, {}).
+-record(foo, {hello=1}).
+-record(bar, {hello=2,there=3}).
+
+f0() ->
+ R1 = #nil{},
+ R2 = R1#nil{}, %% stupid code, but compiler shouldn't crash
+ R1 = R2,
+ ok.
+
+f1() ->
+ R1 = #foo{},
+ R2 = R1#foo{}, %% stupid code, but compiler shouldn't crash
+ R1 = R2,
+ ok.
+
+f2() ->
+ R1 = #bar{},
+ R2 = R1#bar{}, %% stupid code, but compiler shouldn't crash
+ R1 = R2,
+ ok.
diff --git a/lib/compiler/test/compilation_SUITE_data/complex_guard.erl b/lib/compiler/test/compilation_SUITE_data/complex_guard.erl
new file mode 100644
index 0000000000..961aa6a460
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/complex_guard.erl
@@ -0,0 +1,31 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2004-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(complex_guard).
+
+-compile(export_all).
+
+?MODULE() ->
+ ok.
+
+f(X1,Y1,Z1) ->
+ if
+ ((X1 =:= 4) or (X1 =:= 5)) and ((Y1 =:= 4) or (Y1 =:= 5)) and ((Z1 =:= 4) or (Z1 =:= 5)) or ((X1 =:= 1) or (X1 =:= 2) or (X1 =:= 3)) and ((Y1 =:= 1) or (Y1 =:= 2) or (Y1 =:= 3)) and ((Z1 =:= 1) or (Z1 =:= 2) or (Z1 =:= 3)) ->
+ true
+ end.
+
diff --git a/lib/compiler/test/compilation_SUITE_data/const_list_256.erl b/lib/compiler/test/compilation_SUITE_data/const_list_256.erl
new file mode 100644
index 0000000000..0baf427911
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/const_list_256.erl
@@ -0,0 +1,282 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1999-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(const_list_256).
+-export([?MODULE/0]).
+
+?MODULE() ->
+ put_list(x),
+ ok.
+
+put_list(A) ->
+ [{A, 255},
+ {A, 254},
+ {A, 253},
+ {A, 252},
+ {A, 251},
+ {A, 250},
+ {A, 249},
+ {A, 248},
+ {A, 247},
+ {A, 246},
+ {A, 245},
+ {A, 244},
+ {A, 243},
+ {A, 242},
+ {A, 241},
+ {A, 240},
+ {A, 239},
+ {A, 238},
+ {A, 237},
+ {A, 236},
+ {A, 235},
+ {A, 234},
+ {A, 233},
+ {A, 232},
+ {A, 231},
+ {A, 230},
+ {A, 229},
+ {A, 228},
+ {A, 227},
+ {A, 226},
+ {A, 225},
+ {A, 224},
+ {A, 223},
+ {A, 222},
+ {A, 221},
+ {A, 220},
+ {A, 219},
+ {A, 218},
+ {A, 217},
+ {A, 216},
+ {A, 215},
+ {A, 214},
+ {A, 213},
+ {A, 212},
+ {A, 211},
+ {A, 210},
+ {A, 209},
+ {A, 208},
+ {A, 207},
+ {A, 206},
+ {A, 205},
+ {A, 204},
+ {A, 203},
+ {A, 202},
+ {A, 201},
+ {A, 200},
+ {A, 199},
+ {A, 198},
+ {A, 197},
+ {A, 196},
+ {A, 195},
+ {A, 194},
+ {A, 193},
+ {A, 192},
+ {A, 191},
+ {A, 190},
+ {A, 189},
+ {A, 188},
+ {A, 187},
+ {A, 186},
+ {A, 185},
+ {A, 184},
+ {A, 183},
+ {A, 182},
+ {A, 181},
+ {A, 180},
+ {A, 179},
+ {A, 178},
+ {A, 177},
+ {A, 176},
+ {A, 175},
+ {A, 174},
+ {A, 173},
+ {A, 172},
+ {A, 171},
+ {A, 170},
+ {A, 169},
+ {A, 168},
+ {A, 167},
+ {A, 166},
+ {A, 165},
+ {A, 164},
+ {A, 163},
+ {A, 162},
+ {A, 161},
+ {A, 160},
+ {A, 159},
+ {A, 158},
+ {A, 157},
+ {A, 156},
+ {A, 155},
+ {A, 154},
+ {A, 153},
+ {A, 152},
+ {A, 151},
+ {A, 150},
+ {A, 149},
+ {A, 148},
+ {A, 147},
+ {A, 146},
+ {A, 145},
+ {A, 144},
+ {A, 143},
+ {A, 142},
+ {A, 141},
+ {A, 140},
+ {A, 139},
+ {A, 138},
+ {A, 137},
+ {A, 136},
+ {A, 135},
+ {A, 134},
+ {A, 133},
+ {A, 132},
+ {A, 131},
+ {A, 130},
+ {A, 129},
+ {A, 128},
+ {A, 127},
+ {A, 126},
+ {A, 125},
+ {A, 124},
+ {A, 123},
+ {A, 122},
+ {A, 121},
+ {A, 120},
+ {A, 119},
+ {A, 118},
+ {A, 117},
+ {A, 116},
+ {A, 115},
+ {A, 114},
+ {A, 113},
+ {A, 112},
+ {A, 111},
+ {A, 110},
+ {A, 109},
+ {A, 108},
+ {A, 107},
+ {A, 106},
+ {A, 105},
+ {A, 104},
+ {A, 103},
+ {A, 102},
+ {A, 101},
+ {A, 100},
+ {A, 99},
+ {A, 98},
+ {A, 97},
+ {A, 96},
+ {A, 95},
+ {A, 94},
+ {A, 93},
+ {A, 92},
+ {A, 91},
+ {A, 90},
+ {A, 89},
+ {A, 88},
+ {A, 87},
+ {A, 86},
+ {A, 85},
+ {A, 84},
+ {A, 83},
+ {A, 82},
+ {A, 81},
+ {A, 80},
+ {A, 79},
+ {A, 78},
+ {A, 77},
+ {A, 76},
+ {A, 75},
+ {A, 74},
+ {A, 73},
+ {A, 72},
+ {A, 71},
+ {A, 70},
+ {A, 69},
+ {A, 68},
+ {A, 67},
+ {A, 66},
+ {A, 65},
+ {A, 64},
+ {A, 63},
+ {A, 62},
+ {A, 61},
+ {A, 60},
+ {A, 59},
+ {A, 58},
+ {A, 57},
+ {A, 56},
+ {A, 55},
+ {A, 54},
+ {A, 53},
+ {A, 52},
+ {A, 51},
+ {A, 50},
+ {A, 49},
+ {A, 48},
+ {A, 47},
+ {A, 46},
+ {A, 45},
+ {A, 44},
+ {A, 43},
+ {A, 42},
+ {A, 41},
+ {A, 40},
+ {A, 39},
+ {A, 38},
+ {A, 37},
+ {A, 36},
+ {A, 35},
+ {A, 34},
+ {A, 33},
+ {A, 32},
+ {A, 31},
+ {A, 30},
+ {A, 29},
+ {A, 28},
+ {A, 27},
+ {A, 26},
+ {A, 25},
+ {A, 24},
+ {A, 23},
+ {A, 22},
+ {A, 21},
+ {A, 20},
+ {A, 19},
+ {A, 18},
+ {A, 17},
+ {A, 16},
+ {A, 15},
+ {A, 14},
+ {A, 13},
+ {A, 12},
+ {A, 11},
+ {A, 10},
+ {A, 9},
+ {A, 8},
+ {A, 7},
+ {A, 6},
+ {A, 5},
+ {A, 4},
+ {A, 3},
+ {A, 2},
+ {A, 1},
+ {A, 0}].
diff --git a/lib/compiler/test/compilation_SUITE_data/convopts.erl b/lib/compiler/test/compilation_SUITE_data/convopts.erl
new file mode 100644
index 0000000000..429c683ca9
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/convopts.erl
@@ -0,0 +1,159 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2002-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(convopts).
+
+-export([?MODULE/0]).
+
+-define(UINT32_MAX, ((1 bsl 32) - 1)).
+
+?MODULE() ->
+ Type = 12345,
+ Inst = 1,
+ Zone = 0,
+ case convopts([{dest, {tipc_name, Type, Inst, Zone}}]) of
+ {ok, [{$B, <<Type:32, Inst:32, Zone:32>>}]} ->
+ ok;
+ Other ->
+ {error, Other}
+ end.
+
+
+
+convopts(Opts) ->
+ catch
+ case getopts(Opts, [active, recvfrom, importance, distribution,
+ dest]) of
+ {[Active, Recvfrom, Importance, Distribution,
+ Dest], []} ->
+ {R, RR} =
+ case {Active, Recvfrom} of
+ {[], [recvfrom]} ->
+ throw({error, einval});
+ {_, [recvfrom]} ->
+ {$r, $R};
+ {_, _} ->
+ {$e, $E}
+ end,
+ {ok,
+ lists:flatten(
+ [case Active of
+ [{active, true}] ->
+ [{R, <<?UINT32_MAX:32>>}];
+ [{active, N}] when integer(N),
+ 0 =< N, N < ?UINT32_MAX ->
+ [{R, <<N:32>>}];
+ [{active, N}] when integer(N),
+ -?UINT32_MAX < N, N < 0 ->
+ [{RR, <<-N:32>>}];
+ [{active, once}] ->
+ [{R, <<1:32>>}];
+ [{active, false}] ->
+ [{R, <<0:32>>}];
+ [] ->
+ [];
+ _ ->
+ throw({error, einval})
+ end,
+ case Importance of
+ [{importance, normal}] ->
+ [{$i, []}];
+ [{importance, high}] ->
+ [{$I, []}];
+ [] ->
+ [];
+ _ ->
+ throw({error, einval})
+ end,
+ case Distribution of
+ [distribution] ->
+ [{$d, []}];
+ [] ->
+ [];
+ _ ->
+ throw({error, einval})
+ end,
+ case Dest of
+ %% Port addressed message
+ [{dest, {tipc_port_id, Port, Proc}}]
+ when binary(Port),
+ integer(Proc), 0 =< Proc, Proc =< ?UINT32_MAX
+ ;
+ list(Port),
+ integer(Proc), 0 =< Proc, Proc =< ?UINT32_MAX ->
+ [{$p, [Port | <<Proc:32>>]}];
+ %% Name addressed message
+ [{dest, {tipc_name, Type, Inst, Zone}}]
+ when integer(Type), 0 =< Type, Type =< ?UINT32_MAX,
+ integer(Inst), 0 =< Inst, Inst =< ?UINT32_MAX,
+ integer(Zone), 0 =< Zone, Zone =< ?UINT32_MAX ->
+ [{$B, <<Type:32, Inst:32, Zone:32>>}];
+ %%
+ %% This undocumented clause uses an undocumented
+ %% feature of the TIPC socket interface that takes
+ %% advantage of some gory internals of the protocol.
+ %% It is protocol implementation dependant and
+ %% breaks the whole idea of location transparency
+ %% for name addressed messages. Therefore it should
+ %% only be used when all other possibilities are
+ %% exhausted.
+ %%
+ [{dest, {tipc_name, Type, Inst,
+ {tipc_processor_id,
+ Zone, Subnetwork, Processor}}}]
+ when integer(Type), 0 =< Type, Type =< ?UINT32_MAX,
+ integer(Inst), 0 =< Inst, Inst =< ?UINT32_MAX,
+ integer(Zone),
+ 0 =< Zone, Zone < 16#FF,
+ integer(Subnetwork),
+ 0 =< Subnetwork, Subnetwork < 16#FFF,
+ integer(Processor),
+ 0 =< Processor, Processor < 16#FFF ->
+ [{$B, <<Type:32,
+ Inst:32,
+ Zone:8, Subnetwork:12, Processor:12>>}];
+ [] ->
+ [];
+ _ ->
+ throw({error, einval})
+ end
+ ])};
+ _ ->
+ throw({error, einval})
+ end.
+
+
+
+getopts(List, Options) when list(List), list(Options) ->
+ getopts_1(Options, List, []).
+
+getopts_1([], List, Result) ->
+ {lists:reverse(Result), List};
+getopts_1([Option | Options], List, Result) ->
+ {Optvals, Remaining} = getopts_2(List, Option, [], []),
+ getopts_1(Options, Remaining, [Optvals | Result]).
+
+getopts_2([], _Option, Result, Remaining) ->
+ {lists:reverse(Result), lists:reverse(Remaining)};
+getopts_2([Option | Tail], Option, Result, Remaining) ->
+ getopts_2(Tail, Option, [Option | Result], Remaining);
+getopts_2([Optval | Tail], Option, Result, Remaining)
+ when element(1, Optval) == Option ->
+ getopts_2(Tail, Option, [Optval | Result], Remaining);
+getopts_2([Other | Tail], Option, Result, Remaining) ->
+ getopts_2(Tail, Option, Result, [Other | Remaining]).
diff --git a/lib/compiler/test/compilation_SUITE_data/guards.erl b/lib/compiler/test/compilation_SUITE_data/guards.erl
new file mode 100644
index 0000000000..84e41b8ede
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/guards.erl
@@ -0,0 +1,106 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1998-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(guards).
+
+-export([guards/0]).
+
+guards() ->
+ ok = t(),
+ ok = f(),
+ ok = ct(1),
+ ok = multi(1),
+ ok = multi(2),
+ ok = multi(3).
+
+%% The following tests are always true.
+t() when integer(42) ->
+ ok;
+t() when float(2.0) ->
+ ok;
+t() when number(7) ->
+ ok;
+t() when number(3.14) ->
+ ok;
+t() when atom(error) ->
+ ok;
+t() when list([a]) ->
+ ok;
+t() when tuple({}) ->
+ ok;
+t() when tuple({1, 2}) ->
+ ok.
+
+%% The following tests are always false.
+f() when integer(a) ->
+ ok;
+f() when float(b) ->
+ ok;
+f() when number(c) ->
+ ok;
+f() when atom(42) ->
+ ok;
+f() when list(33) ->
+ ok;
+f() when list({}) ->
+ ok;
+f() when list({1, 2}) ->
+ ok;
+f() when tuple(33) ->
+ ok;
+f() when tuple([a]) ->
+ ok;
+f() when tuple([]) ->
+ ok;
+f() when tuple(35) ->
+ ok;
+f() ->
+ ok.
+
+%% The following tests are always true.
+ct(X) ->
+ case X of
+ Y when integer(42) ->
+ ok;
+ Y when float(2.0) ->
+ ok;
+ Y when number(7) ->
+ ok;
+ Y when number(3.14) ->
+ ok;
+ Y when atom(error) ->
+ ok;
+ Y when list([a]) ->
+ ok;
+ Y when tuple({}) ->
+ ok;
+ Y when tuple({1, 2}) ->
+ ok
+ end.
+
+multi(X) ->
+ case X of
+ Y when float(Y) ; integer(Y) ->
+ ok;
+ Y when Y > 1, Y < 10 ; atom(Y) ->
+ ok;
+ Y when Y == 4, number(Y) ; list(Y) ->
+ pannkaka;
+ Y when Y==3 ; Y==5 ; Y==6 ->
+ ok
+ end.
diff --git a/lib/compiler/test/compilation_SUITE_data/live_var.erl b/lib/compiler/test/compilation_SUITE_data/live_var.erl
new file mode 100644
index 0000000000..483eec0630
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/live_var.erl
@@ -0,0 +1,30 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2002-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(live_var).
+-export([?MODULE/0,start/0]).
+
+?MODULE() ->
+ ok.
+
+start() ->
+ receive
+ after 3000 ->
+ A = 5
+ end,
+ A.
diff --git a/lib/compiler/test/compilation_SUITE_data/long_string.erl b/lib/compiler/test/compilation_SUITE_data/long_string.erl
new file mode 100644
index 0000000000..b3cf77b13f
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/long_string.erl
@@ -0,0 +1,670 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2004-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(long_string).
+
+-export([?MODULE/0]).
+
+?MODULE() ->
+ Options = "some stupid long string",
+ 49252 = length(generate(Options, "348927432097sfkjfkljf329")),
+ ok.
+
+generate(Options, Glurf) ->
+ "asdhfaslfdjhhwleirsk e4kjhr430usduy fdk;///s llsjkf;laskjfsdfkjasdfkj
+sdkljflasdfkjasldkfjasd" ++ Options ++
+"CSAgICAgICBWZXJzaW9uIDIsIEp1bmUgMTk5MQoKIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBG
+cmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KICAgICAgICAgICAgICAgICAgICAgICA1OSBU
+ZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiBFdmVy
+eW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMK
+IG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2Vk
+LgoKCQkJICAgIFByZWFtYmxlCgogIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUg
+ZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0
+LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKTGljZW5zZSBpcyBpbnRlbmRl
+ZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQpzb2Z0
+d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJz
+LiAgVGhpcwpHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gbW9zdCBvZiB0aGUgRnJl
+ZSBTb2Z0d2FyZQpGb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFt
+IHdob3NlIGF1dGhvcnMgY29tbWl0IHRvCnVzaW5nIGl0LiAgKFNvbWUgb3RoZXIgRnJlZSBTb2Z0
+d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlIGlzIGNvdmVyZWQgYnkKdGhlIEdOVSBMaWJyYXJ5IEdl
+bmVyYWwgUHVibGljIExpY2Vuc2UgaW5zdGVhZC4pICBZb3UgY2FuIGFwcGx5IGl0IHRvCnlvdXIg
+cHJvZ3JhbXMsIHRvby4KCiAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUg
+cmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdApwcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNl
+bnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91CmhhdmUgdGhlIGZyZWVkb20g
+dG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKdGhp
+cyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBj
+YW4gZ2V0IGl0CmlmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2Fy
+ZSBvciB1c2UgcGllY2VzIG9mIGl0CmluIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3Ug
+a25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KCiAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywg
+d2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAphbnlvbmUgdG8gZGVueSB5
+b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuClRo
+ZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZv
+ciB5b3UgaWYgeW91CmRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91
+IG1vZGlmeSBpdC4KCiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBz
+dWNoIGEgcHJvZ3JhbSwgd2hldGhlcgpncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZl
+IHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKeW91IGhhdmUuICBZb3UgbXVzdCBt
+YWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUKc291cmNlIGNv
+ZGUuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVp
+cgpyaWdodHMuCgogIFdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6ICgxKSBj
+b3B5cmlnaHQgdGhlIHNvZnR3YXJlLCBhbmQKKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hp
+Y2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKZGlzdHJpYnV0ZSBhbmQvb3Ig
+bW9kaWZ5IHRoZSBzb2Z0d2FyZS4KCiAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlv
+biBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KdGhhdCBldmVyeW9uZSB1bmRlcnN0
+YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUKc29mdHdhcmUuICBJ
+ZiB0aGUgc29mdHdhcmUgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24s
+IHdlCndhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5v
+dCB0aGUgb3JpZ2luYWwsIHNvCnRoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJz
+IHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsCmF1dGhvcnMnIHJlcHV0YXRpb25zLgoK
+ICBGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBz
+b2Z0d2FyZQpwYXRlbnRzLiAgV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgcmVkaXN0
+cmlidXRvcnMgb2YgYSBmcmVlCnByb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVu
+dCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKcHJvZ3JhbSBwcm9wcmlldGFyeS4gIFRv
+IHByZXZlbnQgdGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55CnBhdGVudCBtdXN0
+IGJlIGxpY2Vuc2VkIGZvciBldmVyeW9uZSdzIGZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBh
+bGwuCgogIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0
+cmlidXRpb24gYW5kCm1vZGlmaWNhdGlvbiBmb2xsb3cuCgwKCQkgICAgR05VIEdFTkVSQUwgUFVC
+TElDIExJQ0VOU0UKICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJV
+VElPTiBBTkQgTU9ESUZJQ0FUSU9OCgogIDAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBw
+cm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMKYSBub3RpY2UgcGxhY2VkIGJ5IHRo
+ZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQKdW5kZXIgdGhl
+IHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoZSAiUHJvZ3JhbSIsIGJl
+bG93LApyZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbSBvciB3b3JrLCBhbmQgYSAid29yayBiYXNl
+ZCBvbiB0aGUgUHJvZ3JhbSIKbWVhbnMgZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0
+aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzoKdGhhdCBpcyB0byBzYXksIGEgd29yayBjb250
+YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwKZWl0aGVyIHZlcmJhdGltIG9y
+IHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXIKbGFuZ3Vh
+Z2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQgbGltaXRh
+dGlvbiBpbgp0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJl
+c3NlZCBhcyAieW91Ii4KCkFjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRp
+b24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90CmNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5
+IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKcnVubmluZyB0aGUgUHJvZ3JhbSBp
+cyBub3QgcmVzdHJpY3RlZCwgYW5kIHRoZSBvdXRwdXQgZnJvbSB0aGUgUHJvZ3JhbQppcyBjb3Zl
+cmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZQpQ
+cm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFBy
+b2dyYW0pLgpXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIFByb2dyYW0g
+ZG9lcy4KCiAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBv
+ZiB0aGUgUHJvZ3JhbSdzCnNvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVk
+aXVtLCBwcm92aWRlZCB0aGF0IHlvdQpjb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1
+Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlCmNvcHlyaWdodCBub3RpY2UgYW5kIGRp
+c2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUKbm90aWNlcyB0aGF0IHJl
+ZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5Owph
+bmQgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhp
+cyBMaWNlbnNlCmFsb25nIHdpdGggdGhlIFByb2dyYW0uCgpZb3UgbWF5IGNoYXJnZSBhIGZlZSBm
+b3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQKeW91IG1heSBh
+dCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBh
+IGZlZS4KCiAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJv
+Z3JhbSBvciBhbnkgcG9ydGlvbgpvZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0
+aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kCmRpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9y
+IHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQphYm92ZSwgcHJvdmlkZWQgdGhhdCB5
+b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgoKICAgIGEpIFlvdSBtdXN0IGNh
+dXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwogICAgc3Rh
+dGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5n
+ZS4KCiAgICBiKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9y
+IHB1Ymxpc2gsIHRoYXQgaW4KICAgIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVy
+aXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueQogICAgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNl
+bnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQKICAgIHBhcnRpZXMgdW5k
+ZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KCiAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJv
+Z3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5CiAgICB3aGVuIHJ1biwg
+eW91IG11c3QgY2F1c2UgaXQsIHdoZW4gc3RhcnRlZCBydW5uaW5nIGZvciBzdWNoCiAgICBpbnRl
+cmFjdGl2ZSB1c2UgaW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5
+IGFuCiAgICBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBu
+b3RpY2UgYW5kIGEKICAgIG5vdGljZSB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvciBlbHNl
+LCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZQogICAgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMg
+bWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlcgogICAgdGhlc2UgY29uZGl0aW9ucywg
+YW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMKICAgIExpY2Vu
+c2UuICAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0
+CiAgICBkb2VzIG5vdCBub3JtYWxseSBwcmludCBzdWNoIGFuIGFubm91bmNlbWVudCwgeW91ciB3
+b3JrIGJhc2VkIG9uCiAgICB0aGUgUHJvZ3JhbSBpcyBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4g
+YW5ub3VuY2VtZW50LikKDApUaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVk
+IHdvcmsgYXMgYSB3aG9sZS4gIElmCmlkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsg
+YXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sCmFuZCBjYW4gYmUgcmVhc29uYWJseSBj
+b25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgp0aGVtc2VsdmVzLCB0
+aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCnNl
+Y3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3
+aGVuIHlvdQpkaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3
+aGljaCBpcyBhIHdvcmsgYmFzZWQKb24gdGhlIFByb2dyYW0sIHRoZSBkaXN0cmlidXRpb24gb2Yg
+dGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCnRoaXMgTGljZW5zZSwgd2hvc2UgcGVy
+bWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCmVudGlyZSB3aG9sZSwg
+YW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZSBp
+dC4KClRodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSBy
+aWdodHMgb3IgY29udGVzdAp5b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkg
+eW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRy
+b2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCmNvbGxlY3RpdmUgd29ya3MgYmFz
+ZWQgb24gdGhlIFByb2dyYW0uCgpJbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90
+aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBQcm9ncmFtCndpdGggdGhlIFByb2dyYW0gKG9yIHdp
+dGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZgphIHN0b3JhZ2Ug
+b3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRl
+cgp0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgoKICAzLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3Ry
+aWJ1dGUgdGhlIFByb2dyYW0gKG9yIGEgd29yayBiYXNlZCBvbiBpdCwKdW5kZXIgU2VjdGlvbiAy
+KSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mClNl
+Y3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhl
+IGZvbGxvd2luZzoKCiAgICBhKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVz
+cG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlCiAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBk
+aXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKICAgIDEgYW5kIDIgYWJvdmUg
+b24gYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9y
+LAoKICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0
+IGxlYXN0IHRocmVlCiAgICB5ZWFycywgdG8gZ2l2ZSBhbnkgdGhpcmQgcGFydHksIGZvciBhIGNo
+YXJnZSBubyBtb3JlIHRoYW4geW91cgogICAgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcg
+c291cmNlIGRpc3RyaWJ1dGlvbiwgYSBjb21wbGV0ZQogICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5
+IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZQogICAgZGlzdHJpYnV0ZWQg
+dW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0KICAg
+IGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKCiAgICBjKSBB
+Y2NvbXBhbnkgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24geW91IHJlY2VpdmVkIGFzIHRvIHRoZSBv
+ZmZlcgogICAgdG8gZGlzdHJpYnV0ZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLiAgKFRoaXMg
+YWx0ZXJuYXRpdmUgaXMKICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmli
+dXRpb24gYW5kIG9ubHkgaWYgeW91CiAgICByZWNlaXZlZCB0aGUgcHJvZ3JhbSBpbiBvYmplY3Qg
+Y29kZSBvciBleGVjdXRhYmxlIGZvcm0gd2l0aCBzdWNoCiAgICBhbiBvZmZlciwgaW4gYWNjb3Jk
+IHdpdGggU3Vic2VjdGlvbiBiIGFib3ZlLikKClRoZSBzb3VyY2UgY29kZSBmb3IgYSB3b3JrIG1l
+YW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKbWFraW5nIG1vZGlmaWNhdGlv
+bnMgdG8gaXQuICBGb3IgYW4gZXhlY3V0YWJsZSB3b3JrLCBjb21wbGV0ZSBzb3VyY2UKY29kZSBt
+ZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1
+cyBhbnkKYXNzb2NpYXRlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2Ny
+aXB0cyB1c2VkIHRvCmNvbnRyb2wgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUg
+ZXhlY3V0YWJsZS4gIEhvd2V2ZXIsIGFzIGEKc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2Ug
+Y29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlCmFueXRoaW5nIHRoYXQgaXMgbm9ybWFs
+bHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5CmZvcm0pIHdpdGggdGhl
+IG1ham9yIGNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlCm9w
+ZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQg
+Y29tcG9uZW50Cml0c2VsZiBhY2NvbXBhbmllcyB0aGUgZXhlY3V0YWJsZS4KCklmIGRpc3RyaWJ1
+dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcKYWNj
+ZXNzIHRvIGNvcHkgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZh
+bGVudAphY2Nlc3MgdG8gY29weSB0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBj
+b3VudHMgYXMKZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhp
+cmQgcGFydGllcyBhcmUgbm90CmNvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0
+aCB0aGUgb2JqZWN0IGNvZGUuCgwKICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1Ymxp
+Y2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92
+aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdApvdGhlcndpc2UgdG8gY29weSwg
+bW9kaWZ5LCBzdWJsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaXMKdm9pZCwgYW5k
+IHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNl
+bnNlLgpIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywgb3IgcmlnaHRz
+LCBmcm9tIHlvdSB1bmRlcgp0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNl
+cyB0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaApwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBs
+aWFuY2UuCgogIDUuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2Us
+IHNpbmNlIHlvdSBoYXZlIG5vdApzaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3Jh
+bnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgpkaXN0cmlidXRlIHRoZSBQcm9ncmFtIG9y
+IGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKcHJvaGliaXRlZCBieSBs
+YXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQptb2Rp
+Znlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0
+aGUKUHJvZ3JhbSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNl
+IHRvIGRvIHNvLCBhbmQKYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywg
+ZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwp0aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBp
+dC4KCiAgNi4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGFueSB3
+b3JrIGJhc2VkIG9uIHRoZQpQcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJl
+Y2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQpvcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0
+cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3JhbSBzdWJqZWN0IHRvCnRoZXNlIHRlcm1zIGFuZCBj
+b25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCnJlc3RyaWN0aW9ucyBv
+biB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4K
+WW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJk
+IHBhcnRpZXMgdG8KdGhpcyBMaWNlbnNlLgoKICA3LiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBh
+IGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50CmluZnJpbmdlbWVudCBvciBm
+b3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCmNvbmRp
+dGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1l
+bnQgb3IKb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBM
+aWNlbnNlLCB0aGV5IGRvIG5vdApleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhp
+cyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdApkaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2lt
+dWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCkxpY2Vuc2UgYW5kIGFueSBv
+dGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKbWF5
+IG5vdCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBh
+dGVudApsaWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9u
+IG9mIHRoZSBQcm9ncmFtIGJ5CmFsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkg
+b3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgp0aGUgb25seSB3YXkgeW91IGNvdWxkIHNh
+dGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCnJlZnJhaW4gZW50aXJl
+bHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCgpJZiBhbnkgcG9ydGlvbiBvZiB0
+aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKYW55IHBh
+cnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRl
+bmRlZCB0bwphcHBseSBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBh
+cHBseSBpbiBvdGhlcgpjaXJjdW1zdGFuY2VzLgoKSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRo
+aXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQpwYXRlbnRzIG9yIG90aGVy
+IHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQpzdWNo
+IGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3Rpbmcg
+dGhlCmludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3
+aGljaCBpcwppbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBl
+b3BsZSBoYXZlIG1hZGUKZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBv
+ZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAp0aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9u
+IGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdApzeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBh
+dXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCnRvIGRpc3RyaWJ1
+dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5v
+dAppbXBvc2UgdGhhdCBjaG9pY2UuCgpUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0
+aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KYmUgYSBjb25zZXF1ZW5jZSBvZiB0
+aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCgwKICA4LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9v
+ciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbgpjZXJ0YWluIGNvdW50cmllcyBl
+aXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKb3JpZ2lu
+YWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGlj
+ZW5zZQptYXkgYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRh
+dGlvbiBleGNsdWRpbmcKdGhvc2UgY291bnRyaWVzLCBzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBw
+ZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZwpjb3VudHJpZXMgbm90IHRodXMgZXhjbHVkZWQuICBJ
+biBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMKdGhlIGxpbWl0YXRpb24gYXMg
+aWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCgogIDkuIFRoZSBGcmVlIFNv
+ZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25z
+Cm9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBu
+ZXcgdmVyc2lvbnMgd2lsbApiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJz
+aW9uLCBidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8KYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3Ig
+Y29uY2VybnMuCgpFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9u
+IG51bWJlci4gIElmIHRoZSBQcm9ncmFtCnNwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRo
+aXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZCAiYW55CmxhdGVyIHZlcnNpb24iLCB5
+b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMK
+ZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQg
+YnkgdGhlIEZyZWUKU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90
+IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZgp0aGlzIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3Nl
+IGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCkZvdW5kYXRp
+b24uCgogIDEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3Jh
+bSBpbnRvIG90aGVyIGZyZWUKcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMg
+YXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlIGF1dGhvcgp0byBhc2sgZm9yIHBlcm1pc3Npb24u
+ICBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUKU29mdHdhcmUg
+Rm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29t
+ZXRpbWVzCm1ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91ciBkZWNpc2lvbiB3aWxsIGJlIGd1
+aWRlZCBieSB0aGUgdHdvIGdvYWxzCm9mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzIG9mIGFs
+bCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQKb2YgcHJvbW90aW5nIHRoZSBz
+aGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCgoJCQkgICAgTk8gV0FSUkFO
+VFkKCiAgMTEuIEJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0Us
+IFRIRVJFIElTIE5PIFdBUlJBTlRZCkZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJN
+SVRURUQgQlkgQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTgpPVEhFUldJU0UgU1RBVEVEIElO
+IFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTClBST1ZJ
+REUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRI
+RVIgRVhQUkVTU0VECk9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
+SEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCk1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
+QSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMKVE8gVEhFIFFVQUxJVFkg
+QU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRQpQ
+Uk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNT
+QVJZIFNFUlZJQ0lORywKUkVQQUlSIE9SIENPUlJFQ1RJT04uCgogIDEyLiBJTiBOTyBFVkVOVCBV
+TkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcK
+V0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9E
+SUZZIEFORC9PUgpSRURJU1RSSUJVVEUgVEhFIFBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBC
+RSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLApJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJ
+QUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcKT1VUIE9GIFRI
+RSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1Qg
+TElNSVRFRApUTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRF
+IE9SIExPU1NFUyBTVVNUQUlORUQgQlkKWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJF
+IE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIKUFJPR1JBTVMpLCBFVkVO
+IElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFClBP
+U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KCgkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJ
+VElPTlMKDAoJICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFt
+cwoKICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUg
+b2YgdGhlIGdyZWF0ZXN0CnBvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkg
+dG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQKZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9u
+ZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCgogIFRvIGRv
+IHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMg
+c2FmZXN0CnRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRv
+IG1vc3QgZWZmZWN0aXZlbHkKY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBl
+YWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QKdGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEg
+cG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCgogICAgPG9uZSBsaW5l
+IHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBk
+b2VzLj4KICAgIENvcHlyaWdodCAoQykgPHllYXI+ICA8bmFtZSBvZiBhdXRob3I+CgogICAgVGhp
+cyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9v
+ciBtb2RpZnkKICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGlj
+IExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u
+OyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogICAgKGF0IHlvdXIgb3B0aW9u
+KSBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4g
+dGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJS
+QU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgICBNRVJDSEFOVEFC
+SUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgICBH
+TlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgIFlvdSBzaG91
+bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl
+CiAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBT
+b2Z0d2FyZQogICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAs
+IEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQoKCkFsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhv
+dyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgoKSWYgdGhlIHBy
+b2dyYW0gaXMgaW50ZXJhY3RpdmUsIG1ha2UgaXQgb3V0cHV0IGEgc2hvcnQgbm90aWNlIGxpa2Ug
+dGhpcwp3aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgoKICAgIEdub21vdmlz
+aW9uIHZlcnNpb24gNjksIENvcHlyaWdodCAoQykgeWVhciBuYW1lIG9mIGF1dGhvcgogICAgR25v
+bW92aXNpb24gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0
+eXBlIGBzaG93IHcnLgogICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxj
+b21lIHRvIHJlZGlzdHJpYnV0ZSBpdAogICAgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyB0eXBl
+IGBzaG93IGMnIGZvciBkZXRhaWxzLgoKVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3
+JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCnBhcnRzIG9mIHRoZSBH
+ZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgT2YgY291cnNlLCB0aGUgY29tbWFuZHMgeW91IHVzZSBt
+YXkKYmUgY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGBzaG93IHcnIGFuZCBgc2hvdyBjJzsg
+dGhleSBjb3VsZCBldmVuIGJlCm1vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBz
+dWl0cyB5b3VyIHByb2dyYW0uCgpZb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlm
+IHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgpzY2hvb2wsIGlmIGFueSwgdG8gc2ln
+biBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZgpuZWNlc3Nhcnku
+ICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6CgogIFlveW9keW5lLCBJbmMuLCBo
+ZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0KICBg
+R25vbW92aXNpb24nICh3aGljaCBtYWtlcyBwYXNzZXMgYXQgY29tcGlsZXJzKSB3cml0dGVuIGJ5
+IEphbWVzIEhhY2tlci4KCiAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTg5CiAg
+VHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKClRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBk
+b2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0gaW50bwpwcm9wcmlldGFy
+eSBwcm9ncmFtcy4gIElmIHlvdXIgcHJvZ3JhbSBpcyBhIHN1YnJvdXRpbmUgbGlicmFyeSwgeW91
+IG1heQpjb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFy
+eSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUKbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2Fu
+dCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsClB1YmxpYyBMaWNlbnNlIGluc3Rl
+YWQgb2YgdGhpcyBMaWNlbnNlLgo=
+ClxjaGFwdGVye1RoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZX0KClxiZWdpbntjZW50ZXJ9
+CntccGFyaW5kZW50IDBpbgoKVmVyc2lvbiAyLCBKdW5lIDE5OTEKCkNvcHlyaWdodCBcY29weXJp
+Z2h0XCAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgoKXGJpZ3NraXAK
+CjU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNB
+CgpcYmlnc2tpcAoKRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUg
+dmVyYmF0aW0gY29waWVzCm9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0
+IGlzIG5vdCBhbGxvd2VkLgp9ClxlbmR7Y2VudGVyfQoKXGJlZ2lue2NlbnRlcn0Ke1xiZlxsYXJn
+ZSBQcmVhbWJsZX0KXGVuZHtjZW50ZXJ9CgoKVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJl
+IGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91ciBmcmVlZG9tIHRvCnNoYXJlIGFuZCBjaGFu
+Z2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzCmlu
+dGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBmcmVl
+IHNvZnR3YXJlLS0tdG8KbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRz
+IHVzZXJzLiAgVGhpcyBHZW5lcmFsIFB1YmxpYwpMaWNlbnNlIGFwcGxpZXMgdG8gbW9zdCBvZiB0
+aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvCmFueSBvdGhlciBw
+cm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvIHVzaW5nIGl0LiAgKFNvbWUgb3RoZXIgRnJl
+ZQpTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlIGlzIGNvdmVyZWQgYnkgdGhlIEdOVSBMaWJy
+YXJ5IEdlbmVyYWwgUHVibGljCkxpY2Vuc2UgaW5zdGVhZC4pICBZb3UgY2FuIGFwcGx5IGl0IHRv
+IHlvdXIgcHJvZ3JhbXMsIHRvby4KCldoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2Ug
+YXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QgcHJpY2UuCk91ciBHZW5lcmFsIFB1YmxpYyBM
+aWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgdGhlCmZyZWVk
+b20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3Ig
+dGhpcyBzZXJ2aWNlCmlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBv
+ciBjYW4gZ2V0IGl0IGlmIHlvdSB3YW50IGl0LAp0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0
+d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0IGluIG5ldyBmcmVlIHByb2dyYW1zOwphbmQgdGhhdCB5
+b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KClRvIHByb3RlY3QgeW91ciByaWdodHMs
+IHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQgYW55b25lIHRvCmRlbnkg
+eW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLiAg
+VGhlc2UKcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMg
+Zm9yIHlvdSBpZiB5b3UKZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZiB5
+b3UgbW9kaWZ5IGl0LgoKRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBz
+dWNoIGEgcHJvZ3JhbSwgd2hldGhlciBncmF0aXMgb3IKZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZl
+IHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQgeW91IGhhdmUuICBZb3UKbXVzdCBt
+YWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUgc291cmNlIGNv
+ZGUuICBBbmQKeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVp
+ciByaWdodHMuCgpXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOiAoMSkgY29w
+eXJpZ2h0IHRoZSBzb2Z0d2FyZSwgYW5kICgyKQpvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNo
+IGdpdmVzIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksCmRpc3RyaWJ1dGUgYW5kL29yIG1v
+ZGlmeSB0aGUgc29mdHdhcmUuCgpBbHNvLCBmb3IgZWFjaCBhdXRob3IncyBwcm90ZWN0aW9uIGFu
+ZCBvdXJzLCB3ZSB3YW50IHRvIG1ha2UgY2VydGFpbiB0aGF0CmV2ZXJ5b25lIHVuZGVyc3RhbmRz
+IHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZSBzb2Z0d2FyZS4gIElmCnRo
+ZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2Ug
+d2FudCBpdHMKcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRo
+ZSBvcmlnaW5hbCwgc28gdGhhdCBhbnkKcHJvYmxlbXMgaW50cm9kdWNlZCBieSBvdGhlcnMgd2ls
+bCBub3QgcmVmbGVjdCBvbiB0aGUgb3JpZ2luYWwgYXV0aG9ycycKcmVwdXRhdGlvbnMuCgpGaW5h
+bGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2Fy
+ZSBwYXRlbnRzLgpXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9y
+cyBvZiBhIGZyZWUgcHJvZ3JhbSB3aWxsCmluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vu
+c2VzLCBpbiBlZmZlY3QgbWFraW5nIHRoZSBwcm9ncmFtCnByb3ByaWV0YXJ5LiAgVG8gcHJldmVu
+dCB0aGlzLCB3ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkgcGF0ZW50IG11c3QKYmUgbGlj
+ZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KClRo
+ZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24g
+YW5kCm1vZGlmaWNhdGlvbiBmb2xsb3cuCgpcYmVnaW57Y2VudGVyfQp7XExhcmdlIFxzYyBUZXJt
+cyBhbmQgQ29uZGl0aW9ucyBGb3IgQ29weWluZywgRGlzdHJpYnV0aW9uIGFuZAogIE1vZGlmaWNh
+dGlvbn0KXGVuZHtjZW50ZXJ9CgoKJVxyZW5ld2NvbW1hbmR7XHRoZWVudW1pfXtcYWxwaGF7ZW51
+bWl9fQpcYmVnaW57ZW51bWVyYXRlfQoKXGFkZHRvY291bnRlcntlbnVtaX17LTF9CgpcaXRlbSAK
+ClRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2gg
+Y29udGFpbnMgYSBub3RpY2UKcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBp
+dCBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlCnRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJs
+aWMgTGljZW5zZS4gIFRoZSBgYFByb2dyYW0nJywgYmVsb3csIHJlZmVycyB0bwphbnkgc3VjaCBw
+cm9ncmFtIG9yIHdvcmssIGFuZCBhIGBgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbScnIG1lYW5z
+IGVpdGhlcgp0aGUgUHJvZ3JhbSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyIGNvcHlyaWdo
+dCBsYXc6IHRoYXQgaXMgdG8gc2F5LCBhCndvcmsgY29udGFpbmluZyB0aGUgUHJvZ3JhbSBvciBh
+IHBvcnRpb24gb2YgaXQsIGVpdGhlciB2ZXJiYXRpbSBvciB3aXRoCm1vZGlmaWNhdGlvbnMgYW5k
+L29yIHRyYW5zbGF0ZWQgaW50byBhbm90aGVyIGxhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLAp0cmFu
+c2xhdGlvbiBpcyBpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4gdGhlIHRlcm0gYGBtb2Rp
+ZmljYXRpb24nJy4pCkVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzIGBgeW91JycuCgpBY3Rp
+dml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24g
+YXJlIG5vdApjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2Nv
+cGUuICBUaGUgYWN0IG9mCnJ1bm5pbmcgdGhlIFByb2dyYW0gaXMgbm90IHJlc3RyaWN0ZWQsIGFu
+ZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0KaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250
+ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZCBvbiB0aGUKUHJvZ3JhbSAoaW5kZXBlbmRlbnQg
+b2YgaGF2aW5nIGJlZW4gbWFkZSBieSBydW5uaW5nIHRoZSBQcm9ncmFtKS4KV2hldGhlciB0aGF0
+IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCgpcaXRlbSBZb3UgbWF5
+IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3Mgc291
+cmNlCiAgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhh
+dCB5b3UgY29uc3BpY3VvdXNseQogIGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBj
+b3B5IGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UKICBhbmQgZGlzY2xhaW1lciBvZiB3
+YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8KICB0aGlz
+IExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsgYW5kIGdpdmUgYW55
+IG90aGVyCiAgcmVjaXBpZW50cyBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNl
+IGFsb25nIHdpdGggdGhlIFByb2dyYW0uCgpZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBo
+eXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQgeW91Cm1heSBhdCB5b3VyIG9w
+dGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KClxp
+dGVtCgpZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9y
+IGFueSBwb3J0aW9uCm9mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9n
+cmFtLCBhbmQgY29weSBhbmQKZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1
+bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCmFib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNv
+IG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CgpcYmVnaW57ZW51bWVyYXRlfQoKXGl0ZW0g
+CgpZb3UgbXVzdCBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5v
+dGljZXMgc3RhdGluZyB0aGF0CnlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2Yg
+YW55IGNoYW5nZS4KClxpdGVtCgpZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0
+cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW4Kd2hvbGUgb3IgaW4gcGFydCBjb250YWlucyBvciBp
+cyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55CnBhcnQgdGhlcmVvZiwgdG8gYmUgbGlj
+ZW5zZWQgYXMgYSB3aG9sZSBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkCnBhcnRpZXMgdW5kZXIg
+dGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KClxpdGVtCklmIHRoZSBtb2RpZmllZCBwcm9ncmFt
+IG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkKd2hlbiBydW4sIHlvdSBtdXN0
+IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaAppbnRlcmFjdGl2ZSB1c2Ug
+aW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuCmFubm91bmNl
+bWVudCBpbmNsdWRpbmcgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgYQpub3Rp
+Y2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IgZWxzZSwgc2F5aW5nIHRoYXQgeW91IHBy
+b3ZpZGUKYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJv
+Z3JhbSB1bmRlcgp0aGVzZSBjb25kaXRpb25zLCBhbmQgdGVsbGluZyB0aGUgdXNlciBob3cgdG8g
+dmlldyBhIGNvcHkgb2YgdGhpcwpMaWNlbnNlLiAgKEV4Y2VwdGlvbjogaWYgdGhlIFByb2dyYW0g
+aXRzZWxmIGlzIGludGVyYWN0aXZlIGJ1dApkb2VzIG5vdCBub3JtYWxseSBwcmludCBzdWNoIGFu
+IGFubm91bmNlbWVudCwgeW91ciB3b3JrIGJhc2VkIG9uCnRoZSBQcm9ncmFtIGlzIG5vdCByZXF1
+aXJlZCB0byBwcmludCBhbiBhbm5vdW5jZW1lbnQuKQoKXGVuZHtlbnVtZXJhdGV9CgoKVGhlc2Ug
+cmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgpp
+ZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRo
+ZSBQcm9ncmFtLAphbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBh
+bmQgc2VwYXJhdGUgd29ya3MgaW4KdGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBp
+dHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQpzZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmli
+dXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKZGlzdHJpYnV0ZSB0aGUg
+c2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCm9u
+IHRoZSBQcm9ncmFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRo
+ZSB0ZXJtcyBvZgp0aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNl
+bnNlZXMgZXh0ZW5kIHRvIHRoZQplbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2
+ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCgpUaHVzLCBpdCBpcyBub3QgdGhl
+IGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKeW91ciBy
+aWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50
+IGlzIHRvCmV4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2Yg
+ZGVyaXZhdGl2ZSBvcgpjb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBQcm9ncmFtLgoKSW4g
+YWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0
+aGUgUHJvZ3JhbQp3aXRoIHRoZSBQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUg
+UHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YKYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0g
+ZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKdGhlIHNjb3BlIG9mIHRoaXMgTGlj
+ZW5zZS4KClxpdGVtCllvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3Ig
+YSB3b3JrIGJhc2VkIG9uIGl0LAp1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4
+ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBw
+cm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOgoKXGJlZ2lue2Vu
+dW1lcmF0ZX0KClxpdGVtCgpBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9u
+ZGluZyBtYWNoaW5lLXJlYWRhYmxlCnNvdXJjZSBjb2RlLCB3aGljaCBtdXN0IGJlIGRpc3RyaWJ1
+dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucwoxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVt
+IGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKClxpdGVtCgpB
+Y2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJl
+ZQp5ZWFycywgdG8gZ2l2ZSBhbnkgdGhpcmQgcGFydHksIGZvciBhIGNoYXJnZSBubyBtb3JlIHRo
+YW4geW91cgpjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9u
+LCBhIGNvbXBsZXRlCm1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBz
+b3VyY2UgY29kZSwgdG8gYmUKZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25z
+IDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0KY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUg
+aW50ZXJjaGFuZ2U7IG9yLAoKXGl0ZW0KCkFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlv
+biB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyCnRvIGRpc3RyaWJ1dGUgY29ycmVzcG9uZGlu
+ZyBzb3VyY2UgY29kZS4gIChUaGlzIGFsdGVybmF0aXZlIGlzCmFsbG93ZWQgb25seSBmb3Igbm9u
+Y29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91CnJlY2VpdmVkIHRoZSBwcm9n
+cmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2gKYW4gb2ZmZXIs
+IGluIGFjY29yZCB3aXRoIFN1YnNlY3Rpb24gYiBhYm92ZS4pCgpcZW5ke2VudW1lcmF0ZX0KCgpU
+aGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhl
+IHdvcmsgZm9yCm1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGFuIGV4ZWN1dGFibGUg
+d29yaywgY29tcGxldGUgc291cmNlCmNvZGUgbWVhbnMgYWxsIHRoZSBzb3VyY2UgY29kZSBmb3Ig
+YWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55CmFzc29jaWF0ZWQgaW50ZXJmYWNlIGRl
+ZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bwpjb250cm9sIGNvbXBpbGF0
+aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBIb3dldmVyLCBhcyBhCnNw
+ZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5j
+bHVkZQphbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291
+cmNlIG9yIGJpbmFyeQpmb3JtKSB3aXRoIHRoZSBtYWpvciBjb21wb25lbnRzIChjb21waWxlciwg
+a2VybmVsLCBhbmQgc28gb24pIG9mIHRoZQpvcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBl
+eGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudAppdHNlbGYgYWNjb21wYW5pZXMg
+dGhlIGV4ZWN1dGFibGUuCgpJZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3Qg
+Y29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nCmFjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVk
+IHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKYWNjZXNzIHRvIGNvcHkgdGhlIHNvdXJj
+ZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2UgY291bnRzIGFzCmRpc3RyaWJ1dGlvbiBvZiB0aGUg
+c291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdApjb21wZWxsZWQg
+dG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgoKXGl0ZW0KWW91
+IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBvciBkaXN0cmlidXRlIHRoZSBQcm9n
+cmFtCmV4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55
+IGF0dGVtcHQKb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSBvciBkaXN0cmli
+dXRlIHRoZSBQcm9ncmFtIGlzCnZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRl
+IHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4KSG93ZXZlciwgcGFydGllcyB3aG8gaGF2
+ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIKdGhpcyBMaWNlbnNl
+IHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMgdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2gK
+cGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgoKXGl0ZW0KWW91IGFyZSBub3QgcmVx
+dWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90CnNpZ25lZCBp
+dC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5
+IG9yCmRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVz
+ZSBhY3Rpb25zIGFyZQpwcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlz
+IExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Cm1vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIFBy
+b2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQpQcm9ncmFtKSwgeW91IGluZGljYXRlIHlv
+dXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAphbGwgaXRzIHRlcm1z
+IGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCnRo
+ZSBQcm9ncmFtIG9yIHdvcmtzIGJhc2VkIG9uIGl0LgoKXGl0ZW0KRWFjaCB0aW1lIHlvdSByZWRp
+c3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQpQcm9ncmFtKSwg
+dGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQpv
+cmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3Jh
+bSBzdWJqZWN0IHRvCnRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1w
+b3NlIGFueSBmdXJ0aGVyCnJlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ug
+b2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9y
+IGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KdGhpcyBMaWNlbnNlLgoK
+XGl0ZW0KSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0
+aW9uIG9mIHBhdGVudAppbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBs
+aW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLApjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAo
+d2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCm90aGVyd2lzZSkgdGhhdCBjb250
+cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKZXhjdXNl
+IHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QK
+ZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlv
+bnMgdW5kZXIgdGhpcwpMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25z
+LCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91Cm1heSBub3QgZGlzdHJpYnV0ZSB0aGUgUHJvZ3Jh
+bSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKbGljZW5zZSB3b3VsZCBub3QgcGVy
+bWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBieQphbGwgdGhv
+c2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3Us
+IHRoZW4KdGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGlj
+ZW5zZSB3b3VsZCBiZSB0bwpyZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRo
+ZSBQcm9ncmFtLgoKSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxp
+ZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCmFueSBwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhl
+IGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8KYXBwbHkgYW5kIHRoZSBzZWN0
+aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKY2lyY3Vtc3RhbmNl
+cy4KCkl0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0
+byBpbmZyaW5nZSBhbnkKcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3Ig
+dG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMg
+dGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQppbnRlZ3JpdHkgb2YgdGhlIGZyZWUg
+c29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMKaW1wbGVtZW50ZWQgYnkgcHVi
+bGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCmdlbmVyb3VzIGNv
+bnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKdGhy
+b3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9m
+IHRoYXQKc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBo
+ZSBvciBzaGUgaXMgd2lsbGluZwp0byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90
+aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKaW1wb3NlIHRoYXQgY2hvaWNlLgoKVGhp
+cyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJl
+bGlldmVkIHRvCmJlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgoK
+XGl0ZW0KSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJl
+c3RyaWN0ZWQgaW4KY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29w
+eXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCm9yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBs
+YWNlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIExpY2Vuc2UKbWF5IGFkZCBhbiBleHBsaWNpdCBn
+ZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nCnRob3NlIGNvdW50
+cmllcywgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcK
+Y291bnRyaWVzIG5vdCB0aHVzIGV4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2Ug
+aW5jb3Jwb3JhdGVzCnRoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkgb2Yg
+dGhpcyBMaWNlbnNlLgoKXGl0ZW0KVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVi
+bGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMKb2YgdGhlIEdlbmVyYWwgUHVibGljIExp
+Y2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsCmJlIHNpbWls
+YXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRl
+dGFpbCB0bwphZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KCkVhY2ggdmVyc2lvbiBp
+cyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIFByb2dyYW0K
+c3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMg
+dG8gaXQgYW5kIGBgYW55CmxhdGVyIHZlcnNpb24nJywgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBm
+b2xsb3dpbmcgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCmVpdGhlciBvZiB0aGF0IHZlcnNpb24g
+b3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlClNvZnR3YXJlIEZv
+dW5kYXRpb24uICBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1i
+ZXIgb2YKdGhpcyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxp
+c2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQpGb3VuZGF0aW9uLgoKXGl0ZW0KSWYgeW91IHdpc2gg
+dG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIFByb2dyYW0gaW50byBvdGhlciBmcmVlCnByb2dy
+YW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRv
+IHRoZSBhdXRob3IKdG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlz
+IGNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlClNvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRo
+ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcwptYWtlIGV4Y2VwdGlvbnMg
+Zm9yIHRoaXMuICBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2Fscwpv
+ZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZy
+ZWUgc29mdHdhcmUgYW5kCm9mIHByb21vdGluZyB0aGUgc2hhcmluZyBhbmQgcmV1c2Ugb2Ygc29m
+dHdhcmUgZ2VuZXJhbGx5LgoKXGJlZ2lue2NlbnRlcn0Ke1xMYXJnZVxzYwpObyBXYXJyYW50eQp9
+ClxlbmR7Y2VudGVyfQoKXGl0ZW0Ke1xzYyBCZWNhdXNlIHRoZSBwcm9ncmFtIGlzIGxpY2Vuc2Vk
+IGZyZWUgb2YgY2hhcmdlLCB0aGVyZSBpcyBubyB3YXJyYW50eQpmb3IgdGhlIHByb2dyYW0sIHRv
+IHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGFwcGxpY2FibGUgbGF3LiAgRXhjZXB0IHdoZW4Kb3Ro
+ZXJ3aXNlIHN0YXRlZCBpbiB3cml0aW5nIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQvb3Igb3Ro
+ZXIgcGFydGllcwpwcm92aWRlIHRoZSBwcm9ncmFtIGBgYXMgaXMnJyB3aXRob3V0IHdhcnJhbnR5
+IG9mIGFueSBraW5kLCBlaXRoZXIgZXhwcmVzc2VkCm9yIGltcGxpZWQsIGluY2x1ZGluZywgYnV0
+IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mCm1lcmNoYW50YWJpbGl0
+eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuICBUaGUgZW50aXJlIHJpc2sg
+YXMKdG8gdGhlIHF1YWxpdHkgYW5kIHBlcmZvcm1hbmNlIG9mIHRoZSBwcm9ncmFtIGlzIHdpdGgg
+eW91LiAgU2hvdWxkIHRoZQpwcm9ncmFtIHByb3ZlIGRlZmVjdGl2ZSwgeW91IGFzc3VtZSB0aGUg
+Y29zdCBvZiBhbGwgbmVjZXNzYXJ5IHNlcnZpY2luZywKcmVwYWlyIG9yIGNvcnJlY3Rpb24ufQoK
+XGl0ZW0Ke1xzYyBJbiBubyBldmVudCB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcg
+b3IgYWdyZWVkIHRvIGluIHdyaXRpbmcKd2lsbCBhbnkgY29weXJpZ2h0IGhvbGRlciwgb3IgYW55
+IG90aGVyIHBhcnR5IHdobyBtYXkgbW9kaWZ5IGFuZC9vcgpyZWRpc3RyaWJ1dGUgdGhlIHByb2dy
+YW0gYXMgcGVybWl0dGVkIGFib3ZlLCBiZSBsaWFibGUgdG8geW91IGZvciBkYW1hZ2VzLAppbmNs
+dWRpbmcgYW55IGdlbmVyYWwsIHNwZWNpYWwsIGluY2lkZW50YWwgb3IgY29uc2VxdWVudGlhbCBk
+YW1hZ2VzIGFyaXNpbmcKb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUgcHJv
+Z3JhbSAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZAp0byBsb3NzIG9mIGRhdGEgb3IgZGF0YSBi
+ZWluZyByZW5kZXJlZCBpbmFjY3VyYXRlIG9yIGxvc3NlcyBzdXN0YWluZWQgYnkKeW91IG9yIHRo
+aXJkIHBhcnRpZXMgb3IgYSBmYWlsdXJlIG9mIHRoZSBwcm9ncmFtIHRvIG9wZXJhdGUgd2l0aCBh
+bnkgb3RoZXIKcHJvZ3JhbXMpLCBldmVuIGlmIHN1Y2ggaG9sZGVyIG9yIG90aGVyIHBhcnR5IGhh
+cyBiZWVuIGFkdmlzZWQgb2YgdGhlCnBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy59CgpcZW5k
+e2VudW1lcmF0ZX0KCgpcYmVnaW57Y2VudGVyfQp7XExhcmdlXHNjIEVuZCBvZiBUZXJtcyBhbmQg
+Q29uZGl0aW9uc30KXGVuZHtjZW50ZXJ9CgoKXHBhZ2VicmVha1syXQoKXHNlY3Rpb24qe0FwcGVu
+ZGl4OiBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgUHJvZ3JhbXN9CgpJZiB5
+b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdy
+ZWF0ZXN0CnBvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2
+ZSB0aGlzIGlzIHRvIG1ha2UgaXQKZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVk
+aXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UKdGVybXMuCgogIFRvIGRvIHNvLCBhdHRh
+Y2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMgc2FmZXN0IHRv
+CiAgYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBl
+ZmZlY3RpdmVseSBjb252ZXkKICB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBm
+aWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0IHRoZQogIGBgY29weXJpZ2h0JycgbGluZSBhbmQgYSBw
+b2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KClxiZWdpbntxdW90ZX0K
+b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3
+aGF0IGl0IGRvZXMuIFxcCkNvcHlyaWdodCAoQykgeXl5eSAgbmFtZSBvZiBhdXRob3IgXFwKClRo
+aXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQv
+b3IgbW9kaWZ5Cml0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExp
+Y2Vuc2UgYXMgcHVibGlzaGVkIGJ5CnRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhl
+ciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCihhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVy
+IHZlcnNpb24uCgpUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBp
+dCB3aWxsIGJlIHVzZWZ1bCwKYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4g
+dGhlIGltcGxpZWQgd2FycmFudHkgb2YKTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEg
+UEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQpHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBm
+b3IgbW9yZSBkZXRhaWxzLgoKWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUg
+R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5v
+dCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxl
+IFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuClxlbmR7cXVv
+dGV9CgpBbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ry
+b25pYyBhbmQgcGFwZXIgbWFpbC4KCklmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtl
+IGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMKd2hlbiBpdCBzdGFydHMgaW4gYW4g
+aW50ZXJhY3RpdmUgbW9kZToKClxiZWdpbntxdW90ZX0KR25vbW92aXNpb24gdmVyc2lvbiA2OSwg
+Q29weXJpZ2h0IChDKSB5eXl5ICBuYW1lIG9mIGF1dGhvciBcXApHbm9tb3Zpc2lvbiBjb21lcyB3
+aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuIFxc
+ClRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1
+dGUgaXQKdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyB0eXBlIGBzaG93IGMnIGZvciBkZXRhaWxz
+LgpcZW5ke3F1b3RlfQoKClRoZSBoeXBvdGhldGljYWwgY29tbWFuZHMge1x0dCBzaG93IHd9IGFu
+ZCB7XHR0IHNob3cgY30gc2hvdWxkIHNob3cgdGhlCmFwcHJvcHJpYXRlIHBhcnRzIG9mIHRoZSBH
+ZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgT2YgY291cnNlLCB0aGUgY29tbWFuZHMKeW91IHVzZSBt
+YXkgYmUgY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIHtcdHQgc2hvdyB3fSBhbmQge1x0dCBz
+aG93IGN9Owp0aGV5IGNvdWxkIGV2ZW4gYmUgbW91c2UtY2xpY2tzIG9yIG1lbnUgaXRlbXMtLS13
+aGF0ZXZlciBzdWl0cyB5b3VyCnByb2dyYW0uCgpZb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1w
+bG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgpzY2hvb2wsIGlmIGFu
+eSwgdG8gc2lnbiBhIGBgY29weXJpZ2h0IGRpc2NsYWltZXInJyBmb3IgdGhlIHByb2dyYW0sIGlm
+Cm5lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKClxiZWdpbntx
+dW90ZX0KWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRl
+cmVzdCBpbiB0aGUgcHJvZ3JhbSBcXApgR25vbW92aXNpb24nICh3aGljaCBtYWtlcyBwYXNzZXMg
+YXQgY29tcGlsZXJzKSB3cml0dGVuIGJ5IEphbWVzIEhhY2tlci4gXFwKCnNpZ25hdHVyZSBvZiBU
+eSBDb29uLCAxIEFwcmlsIDE5ODkgXFwKVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKXGVuZHtx
+dW90ZX0KCgpUaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29y
+cG9yYXRpbmcgeW91ciBwcm9ncmFtCmludG8gcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3Vy
+IHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdQptYXkgY29uc2lkZXIgaXQgbW9y
+ZSB1c2VmdWwgdG8gcGVybWl0IGxpbmtpbmcgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zCndpdGgg
+dGhlIGxpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05V
+IExpYnJhcnkKR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4K
+Cgo=
+" ++ Glurf ++ lists:reverse(Glurf++"kalle").
diff --git a/lib/compiler/test/compilation_SUITE_data/nested_tuples_in_case_expr.erl b/lib/compiler/test/compilation_SUITE_data/nested_tuples_in_case_expr.erl
new file mode 100644
index 0000000000..62402c10b7
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/nested_tuples_in_case_expr.erl
@@ -0,0 +1,36 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2001-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(nested_tuples_in_case_expr).
+-export([nested_tuples_in_case_expr/0,t/2]).
+
+nested_tuples_in_case_expr() ->
+ ok.
+
+t(A, B) ->
+ case {{element(1, A),element(2, B)},{element(2, A),element(2, B)}} of
+ {Same,Same} -> ok;
+ {{0,1},{up,X}} -> bar(X);
+ {_,{X,_}} -> bar(X)
+ end.
+
+bar(X) -> X.
+
+
+
+
diff --git a/lib/compiler/test/compilation_SUITE_data/on_load.erl b/lib/compiler/test/compilation_SUITE_data/on_load.erl
new file mode 100644
index 0000000000..92bcf74624
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/on_load.erl
@@ -0,0 +1,18 @@
+-module(on_load).
+-export([?MODULE/0]).
+
+-on_load(do_on_load/0).
+
+%% Only test that the compiler is able to compile a module
+%% with an on_load attribute. (There will be more thorough tests
+%% of the functionality in code_SUITE in the Kernel application.)
+
+?MODULE() ->
+ ok.
+
+do_on_load() ->
+ local_function(),
+ true.
+
+local_function() ->
+ ok.
diff --git a/lib/compiler/test/compilation_SUITE_data/opt_crash.erl b/lib/compiler/test/compilation_SUITE_data/opt_crash.erl
new file mode 100644
index 0000000000..3a1d625c28
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/opt_crash.erl
@@ -0,0 +1,65 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2005-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(opt_crash).
+-export([?MODULE/0,test/0]).
+
+?MODULE() ->
+ ok.
+
+test() ->
+ URI_Before =
+ {absoluteURI,
+ {scheme,fun() -> nil end},
+ {'hier-part',
+ {'net-path',
+ {srvr,
+ {userinfo,nil},
+ fun() -> nil end},
+ nil},
+ {'query',nil}}},
+
+ {absoluteURI,
+ {scheme,_},
+ {'hier-part',
+ {'net-path',
+ {srvr,
+ {userinfo,nil},
+ HostportBefore},
+ nil},
+ {'query',nil}}} = URI_Before,
+
+ %% ... some funky code ommitted, not relevant ...
+
+ {absoluteURI,
+ {scheme,_},
+ {'hier-part',
+ {'net-path',
+ {srvr,
+ {userinfo,nil},
+ HostportAfter},
+ nil},
+ {'query',nil}}} = URI_Before,
+ %% NOTE: I intended to write URI_After instead of URI_Before
+ %% but the accident revealed that when you add the line below,
+ %% it causes internal error in v3_codegen on compilation
+ {hostport,{hostname,"HostName"},{port,nil}} = HostportAfter,
+
+ ok.
+
+
diff --git a/lib/compiler/test/compilation_SUITE_data/other/vsn_1.erl b/lib/compiler/test/compilation_SUITE_data/other/vsn_1.erl
new file mode 100644
index 0000000000..7cb0778b95
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/other/vsn_1.erl
@@ -0,0 +1,19 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1999-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(vsn_1).
diff --git a/lib/compiler/test/compilation_SUITE_data/other/vsn_3.erl b/lib/compiler/test/compilation_SUITE_data/other/vsn_3.erl
new file mode 100644
index 0000000000..3870e0704d
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/other/vsn_3.erl
@@ -0,0 +1,24 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1999-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(vsn_3).
+
+-export([f/1]).
+
+f(X) ->
+ 2*X.
diff --git a/lib/compiler/test/compilation_SUITE_data/otp_2141.erl b/lib/compiler/test/compilation_SUITE_data/otp_2141.erl
new file mode 100644
index 0000000000..3e766546be
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/otp_2141.erl
@@ -0,0 +1,24 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1998-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(otp_2141).
+-export([otp_2141/0]).
+
+
+otp_2141() ->
+ ok.
diff --git a/lib/compiler/test/compilation_SUITE_data/otp_2173.erl b/lib/compiler/test/compilation_SUITE_data/otp_2173.erl
new file mode 100644
index 0000000000..7e9d4c417b
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/otp_2173.erl
@@ -0,0 +1,31 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1998-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(otp_2173).
+-compile(export_all).
+
+-record(t, {a = fun(X) -> X*X end}).
+
+otp_2173() ->
+ ok.
+
+t() ->
+ #t{}.
+
+
+
diff --git a/lib/compiler/test/compilation_SUITE_data/otp_2330.erl b/lib/compiler/test/compilation_SUITE_data/otp_2330.erl
new file mode 100644
index 0000000000..f5f6717968
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/otp_2330.erl
@@ -0,0 +1,35 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1998-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(otp_2330).
+-export([otp_2330/0, handle_interface/1]).
+
+otp_2330() ->
+ ok.
+
+handle_interface(Data)->
+ Ctrl = 1,
+ case Data of
+ ok ->
+ case Ctrl of
+ [Viar]->integer_to_list(Viar);
+ _ -> []
+
+ end
+ end.
+
diff --git a/lib/compiler/test/compilation_SUITE_data/otp_2380.erl b/lib/compiler/test/compilation_SUITE_data/otp_2380.erl
new file mode 100644
index 0000000000..db2028b347
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/otp_2380.erl
@@ -0,0 +1,36 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1998-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(otp_2380).
+-export([test/0, otp_2380/0]).
+
+otp_2380() ->
+ ok.
+
+-define(FUNC(Name),
+ case Name of
+ dpCh -> 5;
+ dpEvent -> 1;
+ dpc -> 4;
+ dpFm -> 6;
+ dpFm1 -> 6;
+ _ -> false
+ end).
+
+test() ->
+ N = ?FUNC(dpCh).
diff --git a/lib/compiler/test/compilation_SUITE_data/otp_4790.erl b/lib/compiler/test/compilation_SUITE_data/otp_4790.erl
new file mode 100644
index 0000000000..130ee44e80
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/otp_4790.erl
@@ -0,0 +1,63 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2003-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(otp_4790).
+
+-export([?MODULE/0]).
+
+?MODULE() ->
+ pan_test().
+
+
+% --------------------------- OTP Ticket --------------------------------
+% *Id: OTP-4790
+% *Notes: In the code below, the compiler incorrectly assumes
+% wings_pref:get_value(pan_speed) returns a float,
+% causing a crash at run-time.
+
+% The same error could cause tuple tests to be removed,
+% but that would propbably only cause a crash if the
+% Erlang code was incorrect or if it depended on a catch
+% to catch exceptions. Therefore, I consider it unlikely
+% that Erlang programs that don't use floating point
+% arithmetic are likely to be bitten by this bug.
+% -----------------------------------------------------------------------
+
+-record(view, {pan_x,pan_y,distance}).
+
+pan_test() ->
+ pan(13, 3).
+
+pan(Dx0, Dy0) ->
+ #view{pan_x=PanX0,pan_y=PanY0,distance=D} = View = current(),
+ S = D*(1/8)/(51-pref_get_value(pan_speed)),
+ Dx = Dx0*S,
+ Dy = Dy0*S,
+ PanX = PanX0 + Dx,
+ PanY = PanY0 - Dy,
+ set_current(View#view{pan_x=PanX,pan_y=PanY}).
+
+current() ->
+ #view{pan_x=2.0,pan_y=9.75,distance=25.3}.
+
+set_current(#view{pan_x=X,pan_y=Y,distance=D})
+ when is_float(X), is_float(Y), is_float(D) ->
+ io:format("X=~p Y=~p D=~p\n", [X,Y,D]).
+
+pref_get_value(pan_speed) ->
+ 32.
diff --git a/lib/compiler/test/compilation_SUITE_data/otp_5076.erl b/lib/compiler/test/compilation_SUITE_data/otp_5076.erl
new file mode 100644
index 0000000000..f05a4e1148
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/otp_5076.erl
@@ -0,0 +1,27 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2004-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(otp_5076).
+-export([?MODULE/0]).
+
+?MODULE() ->
+ [] = t(),
+ ok.
+
+t() ->
+ [3 || {3=4} <- []].
diff --git a/lib/compiler/test/compilation_SUITE_data/otp_5092.erl b/lib/compiler/test/compilation_SUITE_data/otp_5092.erl
new file mode 100644
index 0000000000..e445e5e1e9
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/otp_5092.erl
@@ -0,0 +1,39 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2004-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(otp_5092).
+-export([?MODULE/0]).
+
+?MODULE() ->
+ [] = t(),
+ [] = t2(),
+ [t] = t4(),
+ [] = t5(),
+ ok.
+
+t() ->
+ [t || {C=D}={_,_} <- []].
+
+t2() ->
+ [X || {X,{Y}={X,X}} <- []].
+
+t4() ->
+ [t || "a"++"b" = "ab" <- ["ab"]].
+
+t5() ->
+ [{X,Y} || {X} <- [], begin Y = X, Y =:= X end].
diff --git a/lib/compiler/test/compilation_SUITE_data/otp_5151.erl b/lib/compiler/test/compilation_SUITE_data/otp_5151.erl
new file mode 100644
index 0000000000..2dccb979df
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/otp_5151.erl
@@ -0,0 +1,61 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2004-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(otp_5151).
+
+-export([?MODULE/0]).
+-export([read_variables/1,read_variables_1/1,read_variables_2/1,
+ read_variables_3/1,read_variables_4/1]).
+
+?MODULE() ->
+ ok.
+
+read_variables(Name) ->
+ case file:consult(Name) of
+ {ok,Vars} -> Vars;
+ {error,Reason} ->
+ erlang:error({bad_installation,file:format_error(Reason)}, [Name])
+ end.
+
+read_variables_1(Name) ->
+ case file:consult(Name) of
+ {ok,Vars} -> Vars;
+ {error,Reason} ->
+ erlang:error({bad_installation,file:format_error(Reason)})
+ end.
+
+read_variables_2(Name) ->
+ case file:consult(Name) of
+ {ok,Vars} -> Vars;
+ {error,Reason} ->
+ erlang:error({bad_installation,file:format_error(Reason)}, [Name])
+ end.
+
+read_variables_3(Name) ->
+ case file:consult(Name) of
+ {ok,Vars} -> Vars;
+ {error,Reason} ->
+ erlang:error({bad_installation,file:format_error(Reason)})
+ end.
+
+read_variables_4(Name) ->
+ case file:consult(Name) of
+ {ok,Vars} -> Vars;
+ {error,Reason} ->
+ exit({bad_installation,file:format_error(Reason)})
+ end.
diff --git a/lib/compiler/test/compilation_SUITE_data/otp_5235.erl b/lib/compiler/test/compilation_SUITE_data/otp_5235.erl
new file mode 100644
index 0000000000..1c918cdf9d
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/otp_5235.erl
@@ -0,0 +1,84 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2004-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(otp_5235).
+-export([?MODULE/0]).
+
+-record(commit, {node,
+ decision, % presume_commit | Decision
+ ram_copies = [],
+ disc_copies = [],
+ disc_only_copies = [],
+ snmp = [],
+ schema_ops = [self(),make_ref()]
+ }).
+
+?MODULE() ->
+ process_flag(trap_exit, true),
+ N = 1024,
+ clone(N),
+ wait(N).
+
+wait(0) -> ok;
+wait(N) ->
+ receive
+ {'EXIT',_,normal} ->
+ wait(N-1);
+ Other ->
+ exit(Other)
+ end.
+
+clone(0) -> ok;
+clone(N) ->
+ spawn_link(fun worker/0),
+ clone(N-1).
+
+worker() ->
+ Seq = lists:seq(1, 10),
+ PidList = [{N,self()} || N <- Seq],
+ Commit = #commit{ram_copies=PidList,disc_copies=[],
+ disc_only_copies=[],snmp=[]},
+ List = lists:duplicate(2, Commit),
+ verify(run(2, List)).
+
+verify([#commit{node=true,ram_copies=L}|T]) ->
+ verify_1(L, 1),
+ verify(T);
+verify([]) -> ok.
+
+verify_1([{N,Pid}|T], N) when Pid =:= self() ->
+ verify_1(T, N+1);
+verify_1([], _) -> ok.
+
+run(0, L) -> L;
+run(N, L) -> run(N-1, reverse(L)).
+
+reverse([]) -> [];
+reverse([H|R]) when record(H, commit) ->
+ [H#commit{
+ ram_copies = lists:reverse(H#commit.ram_copies),
+ disc_copies = lists:reverse(H#commit.disc_copies),
+ disc_only_copies = lists:reverse(H#commit.disc_only_copies),
+ snmp = lists:reverse(H#commit.snmp),
+ node = erlang:yield()
+ }
+ | reverse(R)].
+
+
+
+
diff --git a/lib/compiler/test/compilation_SUITE_data/otp_5244.erl b/lib/compiler/test/compilation_SUITE_data/otp_5244.erl
new file mode 100644
index 0000000000..30849c6b5e
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/otp_5244.erl
@@ -0,0 +1,47 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2004-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(otp_5244).
+-export([?MODULE/0]).
+
+?MODULE() ->
+ L = [{stretch,0,0},
+ {bad,[]},
+ {bad,atom},
+ {bad,0},
+ {bad,16#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA},
+ {bad,16#555555555555555555555555555555555555555555555555555}],
+ remove_failure(L, unit, 0).
+
+remove_failure([], _Unit, _MaxFailure) ->
+ ok;
+remove_failure([{bad,Bad}|_], _Unit, _MaxFailure) ->
+ Bad;
+remove_failure([{stretch,_,Mi}=Stretch | Specs], Unit, _MaxFailure) ->
+ {MinMax,NewMaxFailure} = max_failure(),
+ case {MinMax,remove_failure(Specs, Unit, NewMaxFailure)} of
+ {min,{NewMaxFailure,Rest}} ->
+ {done,[{fixed,Mi} | Rest]};
+ {min,_} when Specs =/= [] ->
+ remove_failure([Stretch|tl(Specs)], Unit, NewMaxFailure);
+ {min,_} ->
+ ok
+ end.
+
+max_failure() ->
+ {min,1}.
diff --git a/lib/compiler/test/compilation_SUITE_data/otp_5404.erl b/lib/compiler/test/compilation_SUITE_data/otp_5404.erl
new file mode 100644
index 0000000000..2de147c082
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/otp_5404.erl
@@ -0,0 +1,51 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2005-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(otp_5404).
+-compile(export_all).
+
+%% Thanks to Martin Bjorklund.
+
+?MODULE() ->
+ ok.
+
+-record(bar, {status, vs = []}).
+
+y() ->
+ x({foo, 1, []}).
+
+get_bar() ->
+ #bar{status = 1}.
+
+x(Trans) ->
+ {foo, Barno, _} = Trans,
+ case get_bar() of
+ Bar when Bar#bar.status /= 2 ->
+ if 1 == 1 ->
+ mnesia:dirty_delete({bar, Barno}),
+ Vs = [1,2] ++ Bar#bar.vs,
+ Bar33 = Bar#bar{status = 1},
+ Bar1 = Bar#bar{status = 3,
+ vs = Vs},
+ [{payment, Barno}];
+ true ->
+ Barno
+ end;
+ _ ->
+ Trans
+ end.
diff --git a/lib/compiler/test/compilation_SUITE_data/otp_5436.erl b/lib/compiler/test/compilation_SUITE_data/otp_5436.erl
new file mode 100644
index 0000000000..4df8d50647
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/otp_5436.erl
@@ -0,0 +1,201 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2005-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(otp_5436).
+-compile(export_all).
+
+?MODULE() ->
+ ok.
+
+-record(readerState, {action_index,
+ log_index,
+ log_name,
+ time_period,
+ rec_id_period,
+ result_format,
+ action_status,
+ filter_type,
+ event_list,
+ sender_list,
+ read_status}).
+
+handle_call(delete,_From,State) ->
+ case catch debug:filter(console,logReader) of
+ true ->
+ case io:format([io_lib:format("~nSYS_DBG {~p,~p,~p}, ~w ~s:~n-- ",[logReader,306,console,self(),sysAssert:format_time2(erlang:now())])|"delete, State: ~p ~n"],[State]) of
+ ok ->
+ ok;
+ _ ->
+ io:format("*** Bad format (~p, ~p) ***~n",["delete, State: ~p ~n",[State]]),
+ ok
+ end;
+ false ->
+ disabled;
+ {'EXIT',{undef,_}} ->
+ case io:format([io_lib:format("~nSYS_DBG {~p,~p,~p}, ~w ~s:~n-- ",[logReader,306,console,self(),sysAssert:format_time2(erlang:now())])|"delete, State: ~p ~n"],[State]) of
+ ok ->
+ ok;
+ _ ->
+ io:format("*** Bad format (~p, ~p) ***~n",["delete, State: ~p ~n",[State]]),
+ ok
+ end;
+ {'EXIT',_} ->
+ debug:filter(console,logReader);
+ _ ->
+ exit({badmatch,{{debug,filter,[console,logReader]},debug:filter(console,logReader)}})
+ end,
+ ?MODULE:clean_result(State),
+ {stop,normal,ok,State};
+handle_call(die,_,State) ->
+ {stop,normal,ok,State};
+handle_call(_Action,_From,#readerState{action_status = 2} = State) ->
+ {reply,error,State};
+handle_call(update_action_attr,_From,State) ->
+ NewState = ?MODULE:handle_update_action_attr(State),
+ case catch debug:filter(console,logReader) of
+ true ->
+ case io:format([io_lib:format("~nSYS_DBG {~p,~p,~p}, ~w ~s:~n-- ",[logReader,317,console,self(),sysAssert:format_time2(erlang:now())])|"update_action_attr, State: ~p ~n"],[NewState]) of
+ ok ->
+ ok;
+ _ ->
+ io:format("*** Bad format (~p, ~p) ***~n",["update_action_attr, State: ~p ~n",[NewState]]),
+ ok
+ end;
+ false ->
+ disabled;
+ {'EXIT',{undef,_}} ->
+ case io:format([io_lib:format("~nSYS_DBG {~p,~p,~p}, ~w ~s:~n-- ",[logReader,317,console,self(),sysAssert:format_time2(erlang:now())])|"update_action_attr, State: ~p ~n"],[NewState]) of
+ ok ->
+ ok;
+ _ ->
+ io:format("*** Bad format (~p, ~p) ***~n",["update_action_attr, State: ~p ~n",[NewState]]),
+ ok
+ end;
+ {'EXIT',_} ->
+ debug:filter(console,logReader);
+ _ ->
+ exit({badmatch,{{debug,filter,[console,logReader]},debug:filter(console,logReader)}})
+ end,
+ {reply,ok,NewState};
+handle_call(update_event_filter,_From,State) ->
+ NewState = State#readerState{event_list = ?MODULE:get_event_list(State#readerState.action_index)},
+ case catch debug:filter(console,logReader) of
+ true ->
+ case io:format([io_lib:format("~nSYS_DBG {~p,~p,~p}, ~w ~s:~n-- ",[logReader,323,console,self(),sysAssert:format_time2(erlang:now())])|"update_event_filter, State: ~p ~n"],[NewState]) of
+ ok ->
+ ok;
+ _ ->
+ io:format("*** Bad format (~p, ~p) ***~n",["update_event_filter, State: ~p ~n",[NewState]]),
+ ok
+ end;
+ false ->
+ disabled;
+ {'EXIT',{undef,_}} ->
+ case io:format([io_lib:format("~nSYS_DBG {~p,~p,~p}, ~w ~s:~n-- ",[logReader,323,console,self(),sysAssert:format_time2(erlang:now())])|"update_event_filter, State: ~p ~n"],[NewState]) of
+ ok ->
+ ok;
+ _ ->
+ io:format("*** Bad format (~p, ~p) ***~n",["update_event_filter, State: ~p ~n",[NewState]]),
+ ok
+ end;
+ {'EXIT',_} ->
+ debug:filter(console,logReader);
+ _ ->
+ exit({badmatch,{{debug,filter,[console,logReader]},debug:filter(console,logReader)}})
+ end,
+ {reply,ok,NewState};
+handle_call(update_sender_filter,_From,State) ->
+ NewState = State#readerState{sender_list = ?MODULE:get_sender_list(State#readerState.action_index)},
+ case catch debug:filter(console,logReader) of
+ true ->
+ case io:format([io_lib:format("~nSYS_DBG {~p,~p,~p}, ~w ~s:~n-- ",[logReader,329,console,self(),sysAssert:format_time2(erlang:now())])|"update_sender_filter, State: ~p ~n"],[NewState]) of
+ ok ->
+ ok;
+ _ ->
+ io:format("*** Bad format (~p, ~p) ***~n",["update_sender_filter, State: ~p ~n",[NewState]]),
+ ok
+ end;
+ false ->
+ disabled;
+ {'EXIT',{undef,_}} ->
+ case io:format([io_lib:format("~nSYS_DBG {~p,~p,~p}, ~w ~s:~n-- ",[logReader,329,console,self(),sysAssert:format_time2(erlang:now())])|"update_sender_filter, State: ~p ~n"],[NewState]) of
+ ok ->
+ ok;
+ _ ->
+ io:format("*** Bad format (~p, ~p) ***~n",["update_sender_filter, State: ~p ~n",[NewState]]),
+ ok
+ end;
+ {'EXIT',_} ->
+ debug:filter(console,logReader);
+ _ ->
+ exit({badmatch,{{debug,filter,[console,logReader]},debug:filter(console,logReader)}})
+ end,
+ {reply,ok,NewState};
+handle_call(Request,_From,State) ->
+ case catch debug:filter(console,logReader) of
+ true ->
+ case io:format([io_lib:format("~nSYS_DBG {~p,~p,~p}, ~w ~s:~n-- ",[logReader,332,console,self(),sysAssert:format_time2(erlang:now())])|"Call ~p, State: ~p ~n"],[Request,State]) of
+ ok ->
+ ok;
+ _ ->
+ io:format("*** Bad format (~p, ~p) ***~n",["Call ~p, State: ~p ~n",[Request,State]]),
+ ok
+ end;
+ false ->
+ disabled;
+ {'EXIT',{undef,_}} ->
+ case io:format([io_lib:format("~nSYS_DBG {~p,~p,~p}, ~w ~s:~n-- ",[logReader,332,console,self(),sysAssert:format_time2(erlang:now())])|"Call ~p, State: ~p ~n"],[Request,State]) of
+ ok ->
+ ok;
+ _ ->
+ io:format("*** Bad format (~p, ~p) ***~n",["Call ~p, State: ~p ~n",[Request,State]]),
+ ok
+ end;
+ {'EXIT',_} ->
+ debug:filter(console,logReader);
+ _ ->
+ exit({badmatch,{{debug,filter,[console,logReader]},debug:filter(console,logReader)}})
+ end,
+ {stop,{error,unknown,Request},State}.
+
+handle_info(Request,State) ->
+ case catch debug:filter(readlog,logReader) of
+ true ->
+ case io:format([io_lib:format("~nSYS_DBG {~p,~p,~p}, ~w ~s:~n-- ",[logReader,345,readlog,self(),sysAssert:format_time2(erlang:now())])|"Info ~p, State: ~p ~n"],[Request,State]) of
+ ok ->
+ ok;
+ _ ->
+ io:format("*** Bad format (~p, ~p) ***~n",["Info ~p, State: ~p ~n",[Request,State]]),
+ ok
+ end;
+ false ->
+ disabled;
+ {'EXIT',{undef,_}} ->
+ case io:format([io_lib:format("~nSYS_DBG {~p,~p,~p}, ~w ~s:~n-- ",[logReader,345,readlog,self(),sysAssert:format_time2(erlang:now())])|"Info ~p, State: ~p ~n"],[Request,State]) of
+ ok ->
+ ok;
+ _ ->
+ io:format("*** Bad format (~p, ~p) ***~n",["Info ~p, State: ~p ~n",[Request,State]]),
+ ok
+ end;
+ {'EXIT',_} ->
+ debug:filter(readlog,logReader);
+ _ ->
+ exit({badmatch,{{debug,filter,[readlog,logReader]},debug:filter(readlog,logReader)}})
+ end,
+ {stop,{error,unknown,Request},State}.
diff --git a/lib/compiler/test/compilation_SUITE_data/otp_5481.erl b/lib/compiler/test/compilation_SUITE_data/otp_5481.erl
new file mode 100644
index 0000000000..5cf114ac4e
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/otp_5481.erl
@@ -0,0 +1,527 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2005-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(otp_5481).
+
+-export([?MODULE/0,encode_cc_clpn/1,get_oper_status/2,foo/0]).
+
+?MODULE() ->
+ ok.
+
+-record(pchVp, {vplEntry,
+ vplLastChange,
+ vplReceiveTrafficDescrIndex = 0,
+ vplTransmitTrafficDescrIndex = 0,
+ vplConnId,
+ vplGroupShapingId}).
+
+-record(pchVc, {vclEntry,
+ vclLastChange,
+ vplConnId,
+ vclConnId,
+ vclShapingMode = 1}).
+-record(spvcVpc, {spvcVpcEntry,
+ currentState,
+ spvcRerCap = false,
+ spvcRerStatus = false}).
+-record(spvcVpcPerm, {spvcVpcEntry,
+ spvcVpcTargetAddress,
+ spvcVpcTargetSelectType,
+ spvcVpcUserName,
+ spvcVpcProviderName,
+ spvcVpcApplication}).
+-record(spvcVcc, {spvcVccEntry,
+ spvcVccTargetAddress,
+ spvcVccTargetSelectType,
+ spvcVccTargetVpi,
+ spvcVccApplication,
+ spvcVccFrKey,
+ spvcVccTranslationMode,
+ spvcRerCap = false,
+ currentState,
+ spvcRerStatus = false}).
+-record(spvcVccPerm, {spvcVccEntry,
+ spvcVccTargetAddress,
+ spvcVccTargetSelectType,
+ spvcVccTargetVpi,
+ spvcVccTargetType,
+ spvcVccApplication,
+ spvcVccFrKey,
+ spvcVccTranslationMode = 2}).
+-record(spvcObj, {spvcEntry,
+ spvcTargetAddress,
+ spvcTargetSelectType,
+ spvcTargetVpi,
+ spvcTargetVci,
+ spvcLastReleaseCause,
+ spvcLastReleaseDiagnostic,
+ spvcRetryInterval = 1000,
+ spvcRetryTimer = 0,
+ spvcRetryThreshold = 1,
+ spvcRetryFailures = 0,
+ spvcRetryLimit = 15,
+ spvcFrKey,
+ spvcVccTranslationMode = 2,
+ spvcRerCap = false,
+ spvcRerStatus = false}).
+-record(spvcTargetVc, {entry,
+ userName = [],
+ providerName = [],
+ opState,
+ rowStatus}).
+
+-record(spvcTargetVp, {entry,
+ userName = [],
+ providerName = [],
+ opState,
+ rowStatus}).
+
+-record(spvcFr, {spvcFrEntry,
+ spvcFrAtmEntry,
+ spvcFrTargetAddress,
+ spvcFrTargetSelectType,
+ spvcFrProviderName,
+ currentState}).
+
+-record(spvcFrPerm, {spvcFrEntry,
+ spvcFrAtmEntry,
+ spvcFrAtmTranslation,
+ spvcFrAdminStatus,
+ spvcFrConnect}).
+
+-record(hci_clpn, {hci_pci,
+ hci_type_of_number,
+ hci_numbering_plan_indicator,
+ hci_presentation_indicator,
+ hci_screening_indicator,
+ hci_number_digits,
+ hci_incomplete_indicator = 0,
+ hci_binary}).
+
+encode_cc_clpn(Spvc) when Spvc#spvcObj.spvcFrKey == undefined ->
+ If = case Spvc of
+ Spvc when record(Spvc,spvcObj) ->
+ case Spvc#spvcObj.spvcEntry of
+ {If_Value,_,_,_} ->
+ If_Value;
+ {If_Value,_,_} ->
+ If_Value
+ end;
+ Spvc when record(Spvc,spvcVcc) ->
+ {If_Value,_,_,_} = Spvc#spvcVcc.spvcVccEntry,
+ If_Value;
+ Spvc when record(Spvc,spvcVpc) ->
+ {If_Value,_,_} = Spvc#spvcVpc.spvcVpcEntry,
+ If_Value;
+ Spvc when record(Spvc,spvcVpcPerm) ->
+ {If_Value,_,_} = Spvc#spvcVpcPerm.spvcVpcEntry,
+ If_Value;
+ Spvc when record(Spvc,spvcVccPerm) ->
+ {If_Value,_,_,_} = Spvc#spvcVccPerm.spvcVccEntry,
+ If_Value;
+ Spvc when record(Spvc,spvcTargetVc) ->
+ {If_Value,_,_} = Spvc#spvcTargetVc.entry,
+ If_Value;
+ Spvc when record(Spvc,spvcTargetVp) ->
+ {If_Value,_} = Spvc#spvcTargetVp.entry,
+ If_Value;
+ Spvc when record(Spvc,pchVc) ->
+ {If_Value,_,_} = Spvc#pchVc.vclEntry,
+ If_Value;
+ Spvc when record(Spvc,pchVp) ->
+ {If_Value,_} = Spvc#pchVp.vplEntry,
+ If_Value;
+ Spvc when record(Spvc,spvcFr) ->
+ {If_Value,_} = Spvc#spvcFr.spvcFrEntry,
+ If_Value;
+ Spvc when record(Spvc,spvcFrPerm) ->
+ {If_Value,_} = Spvc#spvcFrPerm.spvcFrEntry,
+ If_Value;
+ {If_Value,_,_,_} ->
+ If_Value;
+ {If_Value,_,_} ->
+ If_Value;
+ {If_Value,_} ->
+ If_Value;
+ [If_Value|_] ->
+ If_Value;
+ _ ->
+ error
+ end,
+ Col = [2],
+ SpvcAddress = case x:x(get_next,[If],Col) of
+ [{[2,If,20|Address],_}] ->
+ Address;
+ _ ->
+ lists:duplicate(20,0)
+ end,
+ #hci_clpn{hci_type_of_number = 0,
+ hci_numbering_plan_indicator = 2,
+ hci_presentation_indicator = 0,
+ hci_screening_indicator = 1,
+ hci_number_digits = SpvcAddress};
+encode_cc_clpn(Spvc) ->
+ {If,_} = Spvc#spvcObj.spvcFrKey,
+ Col = [4],
+ SpvcFrAddress = case x:x(get_next,[If],Col) of
+ [{[4,If,20|Address],_}] ->
+ Address;
+ _ ->
+ lists:duplicate(20,0)
+ end,
+ #hci_clpn{hci_type_of_number = 0,
+ hci_numbering_plan_indicator = 2,
+ hci_presentation_indicator = 0,
+ hci_screening_indicator = 1,
+ hci_number_digits = SpvcFrAddress}.
+
+
+
+get_oper_status(spvcVpc,Obj) when record(Obj,spvcVpc) ->
+ State = Obj#spvcVpc.currentState,
+ LinkState = get_link_opstate(case Obj of
+ Obj when record(Obj,spvcObj) ->
+ case Obj#spvcObj.spvcEntry of
+ {If_Value,_,_,_} ->
+ If_Value;
+ {If_Value,_,_} ->
+ If_Value
+ end;
+ Obj when record(Obj,spvcVcc) ->
+ {If_Value,_,_,_} =
+Obj#spvcVcc.spvcVccEntry,
+ If_Value;
+ Obj when record(Obj,spvcVpc) ->
+ {If_Value,_,_} = Obj#spvcVpc.spvcVpcEntry,
+ If_Value;
+ Obj when record(Obj,spvcVpcPerm) ->
+ {If_Value,_,_} =
+Obj#spvcVpcPerm.spvcVpcEntry,
+ If_Value;
+ Obj when record(Obj,spvcVccPerm) ->
+ {If_Value,_,_,_} =
+Obj#spvcVccPerm.spvcVccEntry,
+ If_Value;
+ Obj when record(Obj,spvcTargetVc) ->
+ {If_Value,_,_} = Obj#spvcTargetVc.entry,
+ If_Value;
+ Obj when record(Obj,spvcTargetVp) ->
+ {If_Value,_} = Obj#spvcTargetVp.entry,
+ If_Value;
+ Obj when record(Obj,pchVc) ->
+ {If_Value,_,_} = Obj#pchVc.vclEntry,
+ If_Value;
+ Obj when record(Obj,pchVp) ->
+ {If_Value,_} = Obj#pchVp.vplEntry,
+ If_Value;
+ Obj when record(Obj,spvcFr) ->
+ {If_Value,_} = Obj#spvcFr.spvcFrEntry,
+ If_Value;
+ Obj when record(Obj,spvcFrPerm) ->
+ {If_Value,_} = Obj#spvcFrPerm.spvcFrEntry,
+ If_Value;
+ {If_Value,_,_,_} ->
+ If_Value;
+ {If_Value,_,_} ->
+ If_Value;
+ {If_Value,_} ->
+ If_Value;
+ [If_Value|_] ->
+ If_Value;
+ _ ->
+ error
+ end),
+ debug_disabled,
+ case {State,LinkState} of
+ {not_in_service,_} ->
+ 10;
+ {created,_} ->
+ 10;
+ {_,disabled} ->
+ 6;
+ {wait,_} ->
+ 2;
+ {outgoing_callproceeding,_} ->
+ 2;
+ {release_at_restart,_} ->
+ 2;
+ {active,_} ->
+ 3;
+ {rest_in_peace,_} ->
+ 4;
+ {_Other,_} ->
+ 1
+ end;
+get_oper_status(spvcVpc,_) ->
+ debug_disabled,
+ 1;
+get_oper_status(spvcVcc,Obj) when record(Obj,spvcVcc) ->
+ State = Obj#spvcVcc.currentState,
+ LinkState = get_link_opstate(case Obj of
+ Obj when record(Obj,spvcObj) ->
+ case Obj#spvcObj.spvcEntry of
+ {If_Value,_,_,_} ->
+ If_Value;
+ {If_Value,_,_} ->
+ If_Value
+ end;
+ Obj when record(Obj,spvcVcc) ->
+ {If_Value,_,_,_} =
+Obj#spvcVcc.spvcVccEntry,
+ If_Value;
+ Obj when record(Obj,spvcVpc) ->
+ {If_Value,_,_} = Obj#spvcVpc.spvcVpcEntry,
+ If_Value;
+ Obj when record(Obj,spvcVpcPerm) ->
+ {If_Value,_,_} =
+Obj#spvcVpcPerm.spvcVpcEntry,
+ If_Value;
+ Obj when record(Obj,spvcVccPerm) ->
+ {If_Value,_,_,_} =
+Obj#spvcVccPerm.spvcVccEntry,
+ If_Value;
+ Obj when record(Obj,spvcTargetVc) ->
+ {If_Value,_,_} = Obj#spvcTargetVc.entry,
+ If_Value;
+ Obj when record(Obj,spvcTargetVp) ->
+ {If_Value,_} = Obj#spvcTargetVp.entry,
+ If_Value;
+ Obj when record(Obj,pchVc) ->
+ {If_Value,_,_} = Obj#pchVc.vclEntry,
+ If_Value;
+ Obj when record(Obj,pchVp) ->
+ {If_Value,_} = Obj#pchVp.vplEntry,
+ If_Value;
+ Obj when record(Obj,spvcFr) ->
+ {If_Value,_} = Obj#spvcFr.spvcFrEntry,
+ If_Value;
+ Obj when record(Obj,spvcFrPerm) ->
+ {If_Value,_} = Obj#spvcFrPerm.spvcFrEntry,
+ If_Value;
+ {If_Value,_,_,_} ->
+ If_Value;
+ {If_Value,_,_} ->
+ If_Value;
+ {If_Value,_} ->
+ If_Value;
+ [If_Value|_] ->
+ If_Value;
+ _ ->
+ error
+ end),
+ debug_disabled,
+ case {State,LinkState} of
+ {not_in_service,_} ->
+ 10;
+ {created,_} ->
+ 10;
+ {_,disabled} ->
+ 6;
+ {wait,_} ->
+ 2;
+ {outgoing_callproceeding,_} ->
+ 2;
+ {release_at_restart,_} ->
+ 2;
+ {active,_} ->
+ 3;
+ {rest_in_peace,_} ->
+ 4;
+ {_Other,_} ->
+ 1
+ end;
+get_oper_status(spvcVcc,_) ->
+ debug_disabled,
+ 1;
+get_oper_status(spvcTargetVp,Obj) when record(Obj,spvcTargetVp) ->
+ debug_disabled,
+ Key = Obj#spvcTargetVp.entry,
+ case get_link_opstate(case Key of
+ Key when record(Key,spvcObj) ->
+ case Key#spvcObj.spvcEntry of
+ {If_Value,_,_,_} ->
+ If_Value;
+ {If_Value,_,_} ->
+ If_Value
+ end;
+ Key when record(Key,spvcVcc) ->
+ {If_Value,_,_,_} = Key#spvcVcc.spvcVccEntry,
+ If_Value;
+ Key when record(Key,spvcVpc) ->
+ {If_Value,_,_} = Key#spvcVpc.spvcVpcEntry,
+ If_Value;
+ Key when record(Key,spvcVpcPerm) ->
+ {If_Value,_,_} = Key#spvcVpcPerm.spvcVpcEntry,
+ If_Value;
+ Key when record(Key,spvcVccPerm) ->
+ {If_Value,_,_,_} = Key#spvcVccPerm.spvcVccEntry,
+ If_Value;
+ Key when record(Key,spvcTargetVc) ->
+ {If_Value,_,_} = Key#spvcTargetVc.entry,
+ If_Value;
+ Key when record(Key,spvcTargetVp) ->
+ {If_Value,_} = Key#spvcTargetVp.entry,
+ If_Value;
+ Key when record(Key,pchVc) ->
+ {If_Value,_,_} = Key#pchVc.vclEntry,
+ If_Value;
+ Key when record(Key,pchVp) ->
+ {If_Value,_} = Key#pchVp.vplEntry,
+ If_Value;
+ Key when record(Key,spvcFr) ->
+ {If_Value,_} = Key#spvcFr.spvcFrEntry,
+ If_Value;
+ Key when record(Key,spvcFrPerm) ->
+ {If_Value,_} = Key#spvcFrPerm.spvcFrEntry,
+ If_Value;
+ {If_Value,_,_,_} ->
+ If_Value;
+ {If_Value,_,_} ->
+ If_Value;
+ {If_Value,_} ->
+ If_Value;
+ [If_Value|_] ->
+ If_Value;
+ _ ->
+ error
+ end) of
+ disabled ->
+ debug_disabled,
+ 4;
+ enabled ->
+ debug_disabled,
+ case (x:x({pchVp,Key}))#pchVp.vplConnId of
+ undefined ->
+ debug_disabled,
+ 3;
+ _ ->
+ debug_disabled,
+ 2
+ end
+ end;
+get_oper_status(spvcTargetVp,_) ->
+ debug_disabled,
+ 1;
+get_oper_status(spvcTargetVc,Obj) when record(Obj,spvcTargetVc) ->
+ debug_disabled,
+ Key = Obj#spvcTargetVc.entry,
+ case get_link_opstate(case Key of
+ Key when record(Key,spvcObj) ->
+ case Key#spvcObj.spvcEntry of
+ {If_Value,_,_,_} ->
+ If_Value;
+ {If_Value,_,_} ->
+ If_Value
+ end;
+ Key when record(Key,spvcVcc) ->
+ {If_Value,_,_,_} = Key#spvcVcc.spvcVccEntry,
+ If_Value;
+ Key when record(Key,spvcVpc) ->
+ {If_Value,_,_} = Key#spvcVpc.spvcVpcEntry,
+ If_Value;
+ Key when record(Key,spvcVpcPerm) ->
+ {If_Value,_,_} = Key#spvcVpcPerm.spvcVpcEntry,
+ If_Value;
+ Key when record(Key,spvcVccPerm) ->
+ {If_Value,_,_,_} = Key#spvcVccPerm.spvcVccEntry,
+ If_Value;
+ Key when record(Key,spvcTargetVc) ->
+ {If_Value,_,_} = Key#spvcTargetVc.entry,
+ If_Value;
+ Key when record(Key,spvcTargetVp) ->
+ {If_Value,_} = Key#spvcTargetVp.entry,
+ If_Value;
+ Key when record(Key,pchVc) ->
+ {If_Value,_,_} = Key#pchVc.vclEntry,
+ If_Value;
+ Key when record(Key,pchVp) ->
+ {If_Value,_} = Key#pchVp.vplEntry,
+ If_Value;
+ Key when record(Key,spvcFr) ->
+ {If_Value,_} = Key#spvcFr.spvcFrEntry,
+ If_Value;
+ Key when record(Key,spvcFrPerm) ->
+ {If_Value,_} = Key#spvcFrPerm.spvcFrEntry,
+ If_Value;
+ {If_Value,_,_,_} ->
+ If_Value;
+ {If_Value,_,_} ->
+ If_Value;
+ {If_Value,_} ->
+ If_Value;
+ [If_Value|_] ->
+ If_Value;
+ _ ->
+ error
+ end) of
+ disabled ->
+ debug_disabled,
+ 4;
+ enabled ->
+ debug_disabled,
+ case (x:x({pchVc,Key}))#pchVc.vclConnId of
+ undefined ->
+ debug_disabled,
+ 3;
+ _ ->
+ debug_disabled,
+ 2
+ end
+ end;
+get_oper_status(spvcTargetVc,_) ->
+ debug_disabled,
+ 1.
+
+get_link_opstate(If) ->
+ debug_disabled,
+ case x:x(x:x(If),cnhChi,get_link_opstate,[If]) of
+ {genError,_} ->
+ debug_disabled,
+ disabled;
+ Return ->
+ debug_disabled,
+ Return
+ end.
+
+-record(record_A,{
+ field_1,
+ field_2,
+ field_3,
+ field_4,
+ field_5
+ }).
+-record(record_B, { field_1 }).
+-record(record_C, { }).
+
+foo() ->
+ case something of
+ [#record_A{} = A] ->
+ B = foo3(#record_C{}),
+ C = element(B, A),
+ foo2(A),
+ D = C#record_B.field_1,
+ foo4(A#record_A.field_4,
+ B,
+ #record_C{},
+ D)
+ end.
+
+foo2(_) -> ok.
+foo3(_) -> 1.
+foo4(_,_,_,_) -> ok.
+
diff --git a/lib/compiler/test/compilation_SUITE_data/otp_5553.erl b/lib/compiler/test/compilation_SUITE_data/otp_5553.erl
new file mode 100644
index 0000000000..9a7004a980
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/otp_5553.erl
@@ -0,0 +1,82 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2005-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(otp_5553).
+
+-export([?MODULE/0,test/0,handle_cast/2]).
+
+?MODULE() ->
+ ok.
+
+split_quoted_string([34 | _Rest]) -> %% 34 is '"'
+ ok.
+
+test() ->
+ %% does not start with quote
+ io:format("test: split_quoted_string/1 - 5~n"),
+ try split_quoted_string("foo \"bar\"") of
+ SQS_Res5 -> throw({error, test_case_failed, SQS_Res5})
+ catch
+ error: does_not_start_with_quote -> ok
+ end,
+
+ %% no ending quote
+ io:format("test: split_quoted_string/1 - 6~n"),
+ try split_quoted_string("\"foo ") of
+ SQS_Res6 -> throw({error, test_case_failed, SQS_Res6})
+ catch
+ error: no_end_quote -> ok
+ end,
+
+ ok.
+
+test2() ->
+ try split_quoted_string("") of
+ SQS_Res5 -> throw({error, test_case_failed, SQS_Res5})
+ catch
+ error: does_not_start_with_quote -> ok
+ after
+ ok
+ end,
+ try split_quoted_string("") of
+ SQS_Res6 -> throw({error, test_case_failed, SQS_Res6})
+ catch
+ error: no_end_quote -> ok
+ after
+ ok
+ end,
+ ok.
+
+-record(state, {connect_all, known = [], synced = [],
+ lockers = [], syncers = [], node_name = node(),
+ the_locker, the_deleter}).
+
+handle_cast({in_sync, Node, IsKnown}, S) ->
+ NewS = cancel_locker(Node, S, get({sync_tag_my, Node})),
+ NKnown = case lists:member(Node, Known = NewS#state.known) of
+ false when IsKnown == true ->
+1/0,
+ gen_server:cast({global_name_server, Node},
+ {in_sync, node(), false}),
+ [Node | Known];
+ _ ->
+ Known
+ end.
+
+cancel_locker(Node, S, Tag) ->
+ ok.
diff --git a/lib/compiler/test/compilation_SUITE_data/otp_5632.erl b/lib/compiler/test/compilation_SUITE_data/otp_5632.erl
new file mode 100644
index 0000000000..ebf8e47ca2
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/otp_5632.erl
@@ -0,0 +1,230 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2005-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(otp_5632).
+-export([?MODULE/0]).
+-export([pstnproxy_add_headers/2,macosx_workaround/0,fast_cut/3,test/1,test2/1,
+ create_int_jumper_cables/1]).
+
+-import(lists, [foldl/3,last/1,member/2,reverse/1,reverse/2,seq/2,sort/1]).
+
+?MODULE() ->
+ ok.
+
+-record(request, {
+ header
+ }).
+
+
+-record(siporigin, {
+ proto
+ }).
+
+
+%% Test a problem in beam_jump.erl.
+pstnproxy_add_headers(Request, Origin) when is_record(Request, request),
+ is_record(Origin, siporigin) ->
+ NewHeaders1 = Request#request.header,
+ NewHeaders2 =
+ case (Origin#siporigin.proto == tls) or (Origin#siporigin.proto == tls6) of
+ true ->
+ keylist:delete("X-Foo2", NewHeaders1);
+ false ->
+ keylist:delete("X-Foo2", NewHeaders1)
+ end,
+ NewHeaders3 =
+ case (Origin#siporigin.proto == tls) or (Origin#siporigin.proto == tls6) of
+ true ->
+ keylist:delete("X-Foo3", NewHeaders2);
+ false ->
+ keylist:delete("X-Foo3", NewHeaders2)
+ end,
+ Request#request{header = NewHeaders3}.
+
+%% Test a problem in beam_validator.erl.
+macosx_workaround() ->
+ try 1.0/zero()
+ catch
+ error:_ -> ok
+ end.
+
+zero() -> 0.0.
+
+-record(we, {id,
+ perm = 0,
+ name,
+ es,
+ fs,
+ he,
+ vc,
+ vp,
+ mat = default,
+ next_id,
+ mode,
+ mirror = none,
+ light = none,
+ has_shape = true}).
+
+-record(edge, {vs,
+ ve,
+ a = none,
+ b = none,
+ lf,
+ rf,
+ ltpr,
+ ltsu,
+ rtpr,
+ rtsu}).
+
+
+fast_cut(Edge,Pos0,We0) ->
+ {NewEdge = NewV,We} = wings_we:new_ids(1,We0),
+ #we{es = Etab0,
+ vc = Vct0,
+ vp = Vtab0,
+ he = Htab0} = We,
+ Template = gb_trees:get(Edge,Etab0),
+ #edge{vs = Vstart,
+ ve = Vend,
+ a = ACol,
+ b = BCol,
+ lf = Lf,
+ rf = Rf,
+ ltpr = EdgeA,
+ rtsu = EdgeB,
+ rtpr = NextBCol} = Template,
+ VendPos = gb_trees:get(Vend,Vtab0),
+ Vct1 = gb_trees:update(Vend,NewEdge,Vct0),
+ VstartPos = wings_vertex:pos(Vstart,Vtab0),
+ if
+ Pos0 =:= default ->
+ NewVPos0 = e3d_vec:average([VstartPos,VendPos]);
+ true ->
+ NewVPos0 = Pos0
+ end,
+ NewVPos = wings_util:share(NewVPos0),
+ Vct = gb_trees:insert(NewV,NewEdge,Vct1),
+ Vtab = gb_trees:insert(NewV,NewVPos,Vtab0),
+ AColOther = ?MODULE:get_vtx_color(EdgeA,Lf,Etab0),
+ BColOther = ?MODULE:get_vtx_color(NextBCol,Rf,Etab0),
+ Weight = if
+ Pos0 == default ->
+ 0.500000;
+ true ->
+ ADist = e3d_vec:dist(Pos0,VstartPos),
+ BDist = e3d_vec:dist(Pos0,VendPos),
+ try
+ ADist / (ADist + BDist)
+ catch
+ error:badarith ->
+ 0.500000
+ end
+ end,
+ NewColA = wings_color:mix(Weight,AColOther,ACol),
+ NewColB = wings_color:mix(Weight,BCol,BColOther),
+ NewEdgeRec = Template#edge{vs = NewV,
+ a = NewColA,
+ ltsu = Edge,
+ rtpr = Edge},
+ Etab1 = gb_trees:insert(NewEdge,NewEdgeRec,Etab0),
+ Etab2 = ?MODULE:patch_edge(EdgeA,NewEdge,Edge,Etab1),
+ Etab3 = ?MODULE:patch_edge(EdgeB,NewEdge,Edge,Etab2),
+ EdgeRec = Template#edge{ve = NewV,
+ b = NewColB,
+ rtsu = NewEdge,
+ ltpr = NewEdge},
+ Etab = gb_trees:update(Edge,EdgeRec,Etab3),
+ Htab = case gb_sets:is_member(Edge,Htab0) of
+ false ->
+ Htab0;
+ true ->
+ gb_sets:insert(NewEdge,Htab0)
+ end,
+ {We#we{es = Etab,
+ vc = Vct,
+ vp = Vtab,
+ he = Htab},NewV}.
+
+%% A problem in beam_bool.
+
+-record(a, {a,b,c}).
+
+test(As) ->
+ case As of
+ A when A#a.b == []; A#a.b == undefined ->
+ true;
+ _ ->
+ false
+ end.
+
+test2(As) ->
+ case As of
+ A when A#a.b == {a,b,c}; A#a.b == undefined ->
+ true;
+ _ ->
+ false
+ end.
+
+%% Record updating problems.
+
+-record(int_jumper_cable, {id,
+ connectionFieldRef,
+ aiuPlugInUnitRef,
+ connFieldConnector,
+ aiuConnector,
+ dlAttenuation = 1,
+ ulAttenuation = 1,
+ electricalDlDelay = 100,
+ electricalUlDelay = 100,
+ optionals = []}).
+
+create_int_jumper_cables(_Config) ->
+ ct_line:line({{ccl_setup_SUITE,create_int_jumper_cables},637}),
+ ct:comment("Create IntJumperCable MO"),
+ ct_line:line({{ccl_setup_SUITE,create_int_jumper_cables},639}),
+ Parent = "ManagedElement=1,Equipment=1",
+ ct_line:line({{ccl_setup_SUITE,create_int_jumper_cables},641}),
+ I1 = #int_jumper_cable{id = 1,
+ connectionFieldRef = Parent ++ ",ConnectionField=1",
+ aiuPlugInUnitRef = Parent ++ ",Subrack=2,Slot=6,PlugInUnit=1",
+ connFieldConnector = "J1",
+ aiuConnector = 1},
+ ct_line:line({{ccl_setup_SUITE,create_int_jumper_cables},650}),
+ I2 = I1#int_jumper_cable{id = 2,
+ connFieldConnector = "H1",
+ aiuConnector = 2},
+ ct_line:line({{ccl_setup_SUITE,create_int_jumper_cables},657}),
+ I3 = I1#int_jumper_cable{id = 3,
+ aiuPlugInUnitRef = Parent ++ ",Subrack=2,Slot=9,PlugInUnit=1",
+ connFieldConnector = "J2"},
+ ct_line:line({{ccl_setup_SUITE,create_int_jumper_cables},663}),
+ I4 = I3#int_jumper_cable{id = 4,
+ connFieldConnector = "H2",
+ aiuConnector = 2},
+ ct_line:line({{ccl_setup_SUITE,create_int_jumper_cables},670}),
+ I5 = I1#int_jumper_cable{id = 5,
+ aiuPlugInUnitRef = Parent ++ ",Subrack=2,Slot=12,PlugInUnit=1",
+ connFieldConnector = "J3"},
+ ct_line:line({{ccl_setup_SUITE,create_int_jumper_cables},677}),
+ I6 = I5#int_jumper_cable{id = 6,
+ connFieldConnector = "H3",
+ aiuConnector = 2},
+ ct_line:line({{ccl_setup_SUITE,create_int_jumper_cables},684}),
+ [_MO1,_MO2,_MO3,_MO4,_MO5,_MO6] = mub_util:create(mp_mub,Parent,[I1,I2,I3,I4,I5,I6]),
+ ct_line:line({{ccl_setup_SUITE,create_int_jumper_cables},686}),
+ ok.
diff --git a/lib/compiler/test/compilation_SUITE_data/otp_5714.erl b/lib/compiler/test/compilation_SUITE_data/otp_5714.erl
new file mode 100644
index 0000000000..5aefa0a803
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/otp_5714.erl
@@ -0,0 +1,46 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2005-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(otp_5714).
+-export([?MODULE/0,foo/1,mktree_text/1]).
+-binary(<<1,2,3>>).
+
+?MODULE() ->
+ [<<1,2,3>>] = proplists:get_value(binary, ?MODULE:module_info(attributes)),
+ ok.
+
+-record(foo_record, {key,blabla}).
+foo(A) ->
+ hd(tl(element(2,element(2,catch erlang:error(apa))))),
+ case A of
+ A ->
+ B = #foo_record{ key = key1},
+ C = B#foo_record{ key = key2},
+ {X,Y} = {a,b}
+ end.
+
+mktree_text(Val) ->
+ case erlang:is_integer(Val) of
+ _A = IsInteger ->
+ _A;
+ _A ->
+ IsInteger = erlang:exit({{bug,mktree_text,4},{line,34},match,[_A]})
+ end,
+ ok;
+mktree_text(_A1) ->
+ erlang:exit({{bug,mktree_text,4},{line,33},function_clause,[_A1]}).
diff --git a/lib/compiler/test/compilation_SUITE_data/otp_5872.erl b/lib/compiler/test/compilation_SUITE_data/otp_5872.erl
new file mode 100644
index 0000000000..cada7ad994
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/otp_5872.erl
@@ -0,0 +1,46 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2006-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(otp_5872).
+-export([?MODULE/0,chunk_request_body/3]).
+
+?MODULE() ->
+ ok.
+
+chunk_request_body(Body,_ChunkSize,Acc) when Body == <<>>; Body == [] ->
+ LastChunk = "0\r\n",
+ lists:reverse(["\r\n",LastChunk|Acc]);
+chunk_request_body(Body,ChunkSize,Acc) when binary(Body), size(Body) >= ChunkSize ->
+ <<ChunkBody:ChunkSize/binary,
+ Rest/binary>> = Body,
+ Chunk = [ibrowse_lib:dec2hex(4,ChunkSize),"\r\n",ChunkBody,"\r\n"],
+ chunk_request_body(Rest,ChunkSize,[Chunk|Acc]);
+chunk_request_body(Body,_ChunkSize,Acc) when binary(Body) ->
+ BodySize = size(Body),
+ Chunk = [ibrowse_lib:dec2hex(4,BodySize),"\r\n",Body,"\r\n"],
+ LastChunk = "0\r\n",
+ lists:reverse(["\r\n",LastChunk,Chunk|Acc]);
+chunk_request_body(Body,ChunkSize,Acc) when list(Body), length(Body) >= ChunkSize ->
+ {ChunkBody,Rest} = ?MODULE:split_list_at(Body,ChunkSize),
+ Chunk = [ibrowse_lib:dec2hex(4,ChunkSize),"\r\n",ChunkBody,"\r\n"],
+ chunk_request_body(Rest,ChunkSize,[Chunk|Acc]);
+chunk_request_body(Body,_ChunkSize,Acc) when list(Body) ->
+ BodySize = length(Body),
+ Chunk = [ibrowse_lib:dec2hex(4,BodySize),"\r\n",Body,"\r\n"],
+ LastChunk = "0\r\n",
+ lists:reverse(["\r\n",LastChunk,Chunk|Acc]).
diff --git a/lib/compiler/test/compilation_SUITE_data/otp_6121.erl b/lib/compiler/test/compilation_SUITE_data/otp_6121.erl
new file mode 100644
index 0000000000..c71f7806a0
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/otp_6121.erl
@@ -0,0 +1,48 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2006-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(otp_6121).
+-export([?MODULE/0]).
+
+?MODULE() ->
+ 42 = digit_map_timer(<<1>>, 42),
+ test(),
+ Beam = code:which(?MODULE),
+ Sz = filelib:file_size(Beam),
+ io:format("Size of Beam file: ~p\n", [Sz]),
+ if
+ 100 < Sz, Sz < 100000 ->
+ ok
+ end.
+
+test() ->
+ %% Make sure that the compiler does not make an unreasonable
+ %% expansion when trying to optimize the following expressions.
+ <<0:(8*128*1024)>> = id(<<0:(8*128*1024)>>),
+ <<100:(8*128*1024)>> = id(<<100:(8*128*1024)>>),
+ <<1009797879398749873879789879388:(8*128*1024)>> =
+ id(<<1009797879398749873879789879388:(8*128*1024)>>),
+ <<7:(8*128*1024)/little>> = id(<<7:(8*128*1024)/little>>),
+ ok.
+
+id(I) -> I.
+
+digit_map_timer(<<_:8>>, Int) when is_integer(Int) andalso Int >= 0 ->
+ Int;
+digit_map_timer(_, _) ->
+ error.
diff --git a/lib/compiler/test/compilation_SUITE_data/otp_6121a.erl b/lib/compiler/test/compilation_SUITE_data/otp_6121a.erl
new file mode 100644
index 0000000000..caed631aa2
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/otp_6121a.erl
@@ -0,0 +1,32 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2006-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(otp_6121a).
+-export([?MODULE/0]).
+
+%% Thanks to Martin Bjorklund.
+
+?MODULE() ->
+ G = fun() -> ok end,
+ try
+ fun() -> ok end
+ after
+ fun({A, B}) -> A + B end
+ end,
+ ok.
+
diff --git a/lib/compiler/test/compilation_SUITE_data/otp_6121b.erl b/lib/compiler/test/compilation_SUITE_data/otp_6121b.erl
new file mode 100644
index 0000000000..967f078942
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/otp_6121b.erl
@@ -0,0 +1,33 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2006-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(otp_6121b).
+-export([?MODULE/0]).
+
+%% Thanks to Tim Rath.
+
+?MODULE() ->
+ A = {6},
+ try
+ io:fwrite("")
+ after
+ fun () ->
+ fun () -> {B} = A end
+ end
+ end.
+
diff --git a/lib/compiler/test/compilation_SUITE_data/otp_7202.erl b/lib/compiler/test/compilation_SUITE_data/otp_7202.erl
new file mode 100644
index 0000000000..9dca244aa5
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/otp_7202.erl
@@ -0,0 +1,48 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2008-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(otp_7202).
+-export([?MODULE/0]).
+
+?MODULE() ->
+ test().
+
+test() ->
+ List = [a],
+ Error = case func() of
+ no_value -> true;
+ {ok, V} -> V
+ end,
+ %% Liveness calculation for the make_fun2 instruction was wrong -
+ %% it looked like Error would not be needed by the make_fun2 instruction.
+ lists:foreach(fun(_E) ->
+ case Error of
+ true ->
+ ok;
+ false ->
+ ok
+ end
+ end, List).
+
+func() ->
+ no_value.
+
+
+
+
+
diff --git a/lib/compiler/test/compilation_SUITE_data/pattern_expr.erl b/lib/compiler/test/compilation_SUITE_data/pattern_expr.erl
new file mode 100644
index 0000000000..02eacced81
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/pattern_expr.erl
@@ -0,0 +1,30 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1999-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(pattern_expr).
+
+-export(pattern_expr/0).
+
+pattern_expr() ->
+ f().
+
+f() ->
+ case 4 of
+ 2+2 ->
+ ok
+ end.
diff --git a/lib/compiler/test/compilation_SUITE_data/trycatch_4.erl b/lib/compiler/test/compilation_SUITE_data/trycatch_4.erl
new file mode 100644
index 0000000000..7ea710856f
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/trycatch_4.erl
@@ -0,0 +1,50 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2005-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(trycatch_4).
+-export([trycatch_4/0]).
+-record(state, {foo}).
+
+trycatch_4() ->
+ handle_info({foo}, #state{}),
+ ok.
+
+handle_info({_}, State) ->
+ foo(),
+ State#state{foo = bar},
+ case ok of
+ _ ->
+ case catch foo() of
+ ok ->
+ {stop, State}
+ end
+ end;
+handle_info(_, State) ->
+ (catch begin
+ foo(),
+ State#state{foo = bar}
+ end),
+ case ok of
+ _ ->
+ case catch foo() of
+ ok ->
+ {stop, State}
+ end
+ end.
+
+foo() -> ok.
diff --git a/lib/compiler/test/compilation_SUITE_data/vsn_1.erl b/lib/compiler/test/compilation_SUITE_data/vsn_1.erl
new file mode 100644
index 0000000000..a9e23f7c25
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/vsn_1.erl
@@ -0,0 +1,21 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1999-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(vsn_1).
+
+-hubbub(himmap).
diff --git a/lib/compiler/test/compilation_SUITE_data/vsn_2.erl b/lib/compiler/test/compilation_SUITE_data/vsn_2.erl
new file mode 100644
index 0000000000..4833458cf4
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/vsn_2.erl
@@ -0,0 +1,21 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1999-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(vsn_2).
+
+-vsn(34).
diff --git a/lib/compiler/test/compilation_SUITE_data/vsn_3.erl b/lib/compiler/test/compilation_SUITE_data/vsn_3.erl
new file mode 100644
index 0000000000..7b970b2b75
--- /dev/null
+++ b/lib/compiler/test/compilation_SUITE_data/vsn_3.erl
@@ -0,0 +1,22 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1999-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(vsn_3).
+
+f(X) ->
+ 2*X.