diff --git a/libsolidity/ast/ASTUtils.cpp b/libsolidity/ast/ASTUtils.cpp index 532b0bc7af35..0e55d5411145 100644 --- a/libsolidity/ast/ASTUtils.cpp +++ b/libsolidity/ast/ASTUtils.cpp @@ -54,7 +54,12 @@ bool isConstantVariableRecursive(VariableDeclaration const& _varDecl) auto visitor = [](VariableDeclaration const& _variable, util::CycleDetector& _cycleDetector, size_t _depth) { - solAssert(_depth < 256, "Recursion depth limit reached"); + if (_depth >= 256) + { + // Signal as cyclic so callers report a proper error instead of an ICE. + _cycleDetector.run(_variable); + return; + } if (!_variable.value()) // This should result in an error later on. return; diff --git a/test/libsolidity/syntaxTests/inlineAssembly/deep_constant_chain_err.sol b/test/libsolidity/syntaxTests/inlineAssembly/deep_constant_chain_err.sol new file mode 100644 index 000000000000..a7f439c934a4 --- /dev/null +++ b/test/libsolidity/syntaxTests/inlineAssembly/deep_constant_chain_err.sol @@ -0,0 +1,266 @@ +contract C { + uint256 constant c0 = c1; + uint256 constant c1 = c2; + uint256 constant c2 = c3; + uint256 constant c3 = c4; + uint256 constant c4 = c5; + uint256 constant c5 = c6; + uint256 constant c6 = c7; + uint256 constant c7 = c8; + uint256 constant c8 = c9; + uint256 constant c9 = c10; + uint256 constant c10 = c11; + uint256 constant c11 = c12; + uint256 constant c12 = c13; + uint256 constant c13 = c14; + uint256 constant c14 = c15; + uint256 constant c15 = c16; + uint256 constant c16 = c17; + uint256 constant c17 = c18; + uint256 constant c18 = c19; + uint256 constant c19 = c20; + uint256 constant c20 = c21; + uint256 constant c21 = c22; + uint256 constant c22 = c23; + uint256 constant c23 = c24; + uint256 constant c24 = c25; + uint256 constant c25 = c26; + uint256 constant c26 = c27; + uint256 constant c27 = c28; + uint256 constant c28 = c29; + uint256 constant c29 = c30; + uint256 constant c30 = c31; + uint256 constant c31 = c32; + uint256 constant c32 = c33; + uint256 constant c33 = c34; + uint256 constant c34 = c35; + uint256 constant c35 = c36; + uint256 constant c36 = c37; + uint256 constant c37 = c38; + uint256 constant c38 = c39; + uint256 constant c39 = c40; + uint256 constant c40 = c41; + uint256 constant c41 = c42; + uint256 constant c42 = c43; + uint256 constant c43 = c44; + uint256 constant c44 = c45; + uint256 constant c45 = c46; + uint256 constant c46 = c47; + uint256 constant c47 = c48; + uint256 constant c48 = c49; + uint256 constant c49 = c50; + uint256 constant c50 = c51; + uint256 constant c51 = c52; + uint256 constant c52 = c53; + uint256 constant c53 = c54; + uint256 constant c54 = c55; + uint256 constant c55 = c56; + uint256 constant c56 = c57; + uint256 constant c57 = c58; + uint256 constant c58 = c59; + uint256 constant c59 = c60; + uint256 constant c60 = c61; + uint256 constant c61 = c62; + uint256 constant c62 = c63; + uint256 constant c63 = c64; + uint256 constant c64 = c65; + uint256 constant c65 = c66; + uint256 constant c66 = c67; + uint256 constant c67 = c68; + uint256 constant c68 = c69; + uint256 constant c69 = c70; + uint256 constant c70 = c71; + uint256 constant c71 = c72; + uint256 constant c72 = c73; + uint256 constant c73 = c74; + uint256 constant c74 = c75; + uint256 constant c75 = c76; + uint256 constant c76 = c77; + uint256 constant c77 = c78; + uint256 constant c78 = c79; + uint256 constant c79 = c80; + uint256 constant c80 = c81; + uint256 constant c81 = c82; + uint256 constant c82 = c83; + uint256 constant c83 = c84; + uint256 constant c84 = c85; + uint256 constant c85 = c86; + uint256 constant c86 = c87; + uint256 constant c87 = c88; + uint256 constant c88 = c89; + uint256 constant c89 = c90; + uint256 constant c90 = c91; + uint256 constant c91 = c92; + uint256 constant c92 = c93; + uint256 constant c93 = c94; + uint256 constant c94 = c95; + uint256 constant c95 = c96; + uint256 constant c96 = c97; + uint256 constant c97 = c98; + uint256 constant c98 = c99; + uint256 constant c99 = c100; + uint256 constant c100 = c101; + uint256 constant c101 = c102; + uint256 constant c102 = c103; + uint256 constant c103 = c104; + uint256 constant c104 = c105; + uint256 constant c105 = c106; + uint256 constant c106 = c107; + uint256 constant c107 = c108; + uint256 constant c108 = c109; + uint256 constant c109 = c110; + uint256 constant c110 = c111; + uint256 constant c111 = c112; + uint256 constant c112 = c113; + uint256 constant c113 = c114; + uint256 constant c114 = c115; + uint256 constant c115 = c116; + uint256 constant c116 = c117; + uint256 constant c117 = c118; + uint256 constant c118 = c119; + uint256 constant c119 = c120; + uint256 constant c120 = c121; + uint256 constant c121 = c122; + uint256 constant c122 = c123; + uint256 constant c123 = c124; + uint256 constant c124 = c125; + uint256 constant c125 = c126; + uint256 constant c126 = c127; + uint256 constant c127 = c128; + uint256 constant c128 = c129; + uint256 constant c129 = c130; + uint256 constant c130 = c131; + uint256 constant c131 = c132; + uint256 constant c132 = c133; + uint256 constant c133 = c134; + uint256 constant c134 = c135; + uint256 constant c135 = c136; + uint256 constant c136 = c137; + uint256 constant c137 = c138; + uint256 constant c138 = c139; + uint256 constant c139 = c140; + uint256 constant c140 = c141; + uint256 constant c141 = c142; + uint256 constant c142 = c143; + uint256 constant c143 = c144; + uint256 constant c144 = c145; + uint256 constant c145 = c146; + uint256 constant c146 = c147; + uint256 constant c147 = c148; + uint256 constant c148 = c149; + uint256 constant c149 = c150; + uint256 constant c150 = c151; + uint256 constant c151 = c152; + uint256 constant c152 = c153; + uint256 constant c153 = c154; + uint256 constant c154 = c155; + uint256 constant c155 = c156; + uint256 constant c156 = c157; + uint256 constant c157 = c158; + uint256 constant c158 = c159; + uint256 constant c159 = c160; + uint256 constant c160 = c161; + uint256 constant c161 = c162; + uint256 constant c162 = c163; + uint256 constant c163 = c164; + uint256 constant c164 = c165; + uint256 constant c165 = c166; + uint256 constant c166 = c167; + uint256 constant c167 = c168; + uint256 constant c168 = c169; + uint256 constant c169 = c170; + uint256 constant c170 = c171; + uint256 constant c171 = c172; + uint256 constant c172 = c173; + uint256 constant c173 = c174; + uint256 constant c174 = c175; + uint256 constant c175 = c176; + uint256 constant c176 = c177; + uint256 constant c177 = c178; + uint256 constant c178 = c179; + uint256 constant c179 = c180; + uint256 constant c180 = c181; + uint256 constant c181 = c182; + uint256 constant c182 = c183; + uint256 constant c183 = c184; + uint256 constant c184 = c185; + uint256 constant c185 = c186; + uint256 constant c186 = c187; + uint256 constant c187 = c188; + uint256 constant c188 = c189; + uint256 constant c189 = c190; + uint256 constant c190 = c191; + uint256 constant c191 = c192; + uint256 constant c192 = c193; + uint256 constant c193 = c194; + uint256 constant c194 = c195; + uint256 constant c195 = c196; + uint256 constant c196 = c197; + uint256 constant c197 = c198; + uint256 constant c198 = c199; + uint256 constant c199 = c200; + uint256 constant c200 = c201; + uint256 constant c201 = c202; + uint256 constant c202 = c203; + uint256 constant c203 = c204; + uint256 constant c204 = c205; + uint256 constant c205 = c206; + uint256 constant c206 = c207; + uint256 constant c207 = c208; + uint256 constant c208 = c209; + uint256 constant c209 = c210; + uint256 constant c210 = c211; + uint256 constant c211 = c212; + uint256 constant c212 = c213; + uint256 constant c213 = c214; + uint256 constant c214 = c215; + uint256 constant c215 = c216; + uint256 constant c216 = c217; + uint256 constant c217 = c218; + uint256 constant c218 = c219; + uint256 constant c219 = c220; + uint256 constant c220 = c221; + uint256 constant c221 = c222; + uint256 constant c222 = c223; + uint256 constant c223 = c224; + uint256 constant c224 = c225; + uint256 constant c225 = c226; + uint256 constant c226 = c227; + uint256 constant c227 = c228; + uint256 constant c228 = c229; + uint256 constant c229 = c230; + uint256 constant c230 = c231; + uint256 constant c231 = c232; + uint256 constant c232 = c233; + uint256 constant c233 = c234; + uint256 constant c234 = c235; + uint256 constant c235 = c236; + uint256 constant c236 = c237; + uint256 constant c237 = c238; + uint256 constant c238 = c239; + uint256 constant c239 = c240; + uint256 constant c240 = c241; + uint256 constant c241 = c242; + uint256 constant c242 = c243; + uint256 constant c243 = c244; + uint256 constant c244 = c245; + uint256 constant c245 = c246; + uint256 constant c246 = c247; + uint256 constant c247 = c248; + uint256 constant c248 = c249; + uint256 constant c249 = c250; + uint256 constant c250 = c251; + uint256 constant c251 = c252; + uint256 constant c252 = c253; + uint256 constant c253 = c254; + uint256 constant c254 = c255; + uint256 constant c255 = c256; + uint256 constant c256 = 0; + function f() public pure returns (uint t) { + assembly { + t := c0.slot + } + } +} +// ---- +// TypeError 3558: (8614-8621): Constant variable is circular.