# V3548. AUTOSAR. Functions should not be declared at block scope.

This diagnostic rule is based on the software development guidelines developed by AUTOSAR (AUTomotive Open System ARchitecture).

A function declared at the block scope will also be visible in the namespace enclosing the block.

Look at the example:

    namespace Foo
    {
      void func()
      {
        void bar(); // <=
        bar();
      }
    }

    void Foo::bar() // Function 'bar' is visible here
    {
    }

The programmer wanted to narrow the scope of the function by declaring it in the 'func' function block. However, the 'bar' function is also visible outside the 'Foo' namespace. Therefore, one should declare the function explicitly in the enclosing namespace:

    namespace Foo
    {
      void bar();
      void func()
      {
        bar();
      }
    }

    void Foo::bar() // Function 'bar' is visible
    {
    }

Also, due to the ambiguity of the C++ grammar, the function declaration may look like an object declaration:

    struct A
    {
        void foo();
    };

    int main()
    {
      A a();
      a.foo(); // compile-time error
    }

This problem is known as "Most vexing parse": the compiler resolves this ambiguity of "declaring a function or an object" in favor of "declare a function". Therefore, despite the programmer's intention to declare an object of the 'A' class and call the 'A::foo' non-static member function, the compiler will perceive this as a declaration of the 'a' function, that does not accept parameters and returns type 'A'.

To avoid confusion, the analyzer also warns about such declarations.

This diagnostic is classified as:

AUTOSAR-M3.1.2