Class: AdLint::Cc1::ExpressionConstancy

Inherits:
SyntaxTreeVisitor show all
Defined in:
lib/adlint/cc1/syntax.rb

Instance Method Summary collapse

Methods inherited from SyntaxTreeVisitor

#visit_abbreviated_function_declarator, #visit_additive_expression, #visit_alignof_expression, #visit_alignof_type_expression, #visit_and_expression, #visit_ansi_function_declarator, #visit_ansi_function_definition, #visit_array_abstract_declarator, #visit_array_declarator, #visit_array_subscript_expression, #visit_bit_access_by_pointer_expression, #visit_bit_access_by_value_expression, #visit_break_statement, #visit_c99_for_statement, #visit_case_labeled_statement, #visit_cast_expression, #visit_compound_literal_expression, #visit_compound_statement, #visit_conditional_expression, #visit_constant_specifier, #visit_continue_statement, #visit_declaration, #visit_declaration_specifiers, #visit_default_labeled_statement, #visit_do_statement, #visit_enum_specifier, #visit_enum_type_declaration, #visit_enumerator, #visit_equality_expression, #visit_error_expression, #visit_error_statement, #visit_exclusive_or_expression, #visit_expression_statement, #visit_for_statement, #visit_function_abstract_declarator, #visit_function_declaration, #visit_generic_labeled_statement, #visit_goto_statement, #visit_grouped_abstract_declarator, #visit_grouped_declarator, #visit_grouped_expression, #visit_identifier_declarator, #visit_if_else_statement, #visit_if_statement, #visit_inclusive_or_expression, #visit_indirection_expression, #visit_init_declarator, #visit_initializer, #visit_kandr_function_declarator, #visit_kandr_function_definition, #visit_logical_and_expression, #visit_logical_or_expression, #visit_member_access_by_pointer_expression, #visit_member_access_by_value_expression, #visit_member_declaration, #visit_multiplicative_expression, #visit_null_constant_specifier, #visit_parameter_declaration, #visit_parameter_definition, #visit_parameter_type_list, #visit_pointer_abstract_declarator, #visit_relational_expression, #visit_return_statement, #visit_shift_expression, #visit_sizeof_expression, #visit_sizeof_type_expression, #visit_specifier_qualifier_list, #visit_standard_type_specifier, #visit_string_literal_specifier, #visit_struct_declaration, #visit_struct_declarator, #visit_struct_specifier, #visit_struct_type_declaration, #visit_switch_statement, #visit_translation_unit, #visit_type_name, #visit_typedef_declaration, #visit_typedef_type_specifier, #visit_typeof_type_specifier, #visit_unary_arithmetic_expression, #visit_union_specifier, #visit_union_type_declaration, #visit_variable_declaration, #visit_variable_definition, #visit_while_statement

Constructor Details

#initialize(interp_bridge) ⇒ ExpressionConstancy

Returns a new instance of ExpressionConstancy.



5599
5600
5601
# File 'lib/adlint/cc1/syntax.rb', line 5599

def initialize(interp_bridge)
  @interp_bridge = interp_bridge
end

Instance Method Details

#check(expr) ⇒ Object



5603
5604
5605
# File 'lib/adlint/cc1/syntax.rb', line 5603

def check(expr)
  catch(:constancy) { expr.accept(self); true }
end

#visit_address_expression(node) ⇒ Object



5614
5615
5616
# File 'lib/adlint/cc1/syntax.rb', line 5614

def visit_address_expression(node)
  # NOTE: To treat address of variables as an address-constant.
end

#visit_comma_separated_expression(node) ⇒ Object



5618
5619
5620
5621
5622
5623
5624
5625
5626
5627
5628
5629
5630
5631
# File 'lib/adlint/cc1/syntax.rb', line 5618

def visit_comma_separated_expression(node)
  # NOTE: A constant-expression should not contain comma-operators.
  #
  # NOTE: The ISO C99 standard says;
  #
  # 6.6 Constant expressions
  #
  # Constraints
  #
  # 3 Constant expressions shall not contain assignment, increment,
  #   decrement, function-call, or comma operators, except when they are
  #   contained within a subexpression that is not evaluated.
  break_as_inconstant
end

#visit_object_specifier(node) ⇒ Object



5607
5608
5609
5610
5611
5612
# File 'lib/adlint/cc1/syntax.rb', line 5607

def visit_object_specifier(node)
  var_designators = @interp_bridge[:variable_designators][]
  if var_designators.include?(node.identifier.value)
    break_as_inconstant
  end
end