#include <vector>
#include <string>
#include <typeinfo>
#include <array>

int nullGlobal = 0;
int nullGlobal2 = 0 + 1;

class A {
   static int constexpr constexprInt = 3;
   void defaultInitDecl(int *a = nullptr);
   void defaultInitImpl(int *a);
   void defaultInitImpl(int *a, int *b = nullptr);
};

void A::defaultInitDecl(int *a) {
}

void A::defaultInitImpl(int *a = nullptr) {
}

void A::defaultInitImpl(int *a = nullptr, int *b) {
}


void foo1(int a);

void foo1(int a = 2);

void foo1(int a) {
}


std::vector<std::string> foo() {
   std::vector<std::string> aString;
   
   return aString;
}


std::string const & fooRef(std::string const & aString) {
   
   return aString;
}

static int a;

int main() {
   int a;
   int b, c = 0, d;
   /** Full comment*/
   int const e = 2, f = 3;
   int constexpr constexpr_local = 1;
   int g = 4;
   std::vector<int> v1, v2;
   {
      int aa, bb;
   }
   auto fooResult = foo();
   auto fooRefResult = fooRef("Hello");
   std::vector<int> t = {};
   t = {};
   t = {0};
   t = {};
   std::vector<int> v = {};

   // TypeId
   auto typeId = typeid(int).name();
   auto typeId2 = typeid(1).name();

   // List Initialization
   std::array<int, 3> listInitialized1 = {512, 256, 128};
   std::array<int, 3> listInitialized2{{512, 256, 128}};

	// Another idiom for constructor with initializer list
	std::vector<int> v3{34, 23};

	// Static assert
	static_assert(true, "This is a static decl");

   return 0;
}
