// filename:c2011-6-9-2-ex.c
// original examples and/or notes:
// 		(c) ISO/IEC JTC1 SC22 WG14 N1570, April 12, 2011
// http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf
// 			C2011 6.9.2 External object definitions
// compile and output mechanism:
// 		(c) Ogawa Kiyoshi, kaizen@gifu-u.ac.jp, December.xx, 2013
// compile errors and/or wornings:
// 1	(c) Apple LLVM version 4.2 (clang-425.0.27) (based on LLVM 3.2svn)
// 			Target: x86_64-apple-darwin11.4.2 //Thread model: posix
// 		(c) LLVM 2003-2009 University of Illinois at Urbana-Champaign.
// 2    gcc-4.9 (GCC) 4.9.0 20131229 (experimental)
//      Copyright (C) 2013 Free Software Foundation, Inc.
#include <stdio.h>
// Example 1
int i1 = 1; // definition, external linkage
static int i2 = 2; // definition, internal linkage
extern int i3 = 3; // definition, external linkage
int i4; // tentative definition, external linkage
static int i5; // tentative definition, internal linkage
int i1; // valid tentative definition, refers to previous
int i2; // 6.2.2 renders undefined, linkage disagreement //**
//c2011-6-9-2-ex.c:19:5: error: non-static declaration of 'i2' follows static declaration
//int i2; // 6.2.2 renders undefined, linkage disagreement
//    ^
//c2011-6-9-2-ex.c:14:12: note: previous definition is here
//static int i2 = 2; // definition, internal linkage
//           ^

int i3; // valid tentative definition, refers to previous
int i4; // valid tentative definition, refers to previous
int i5; // 6.2.2 renders undefined, linkage disagreement //**
//c2011-6-9-2-ex.c:22:5: error: non-static declaration of 'i5' follows static declaration
//int i5; // 6.2.2 renders undefined, linkage disagreement
//    ^
//c2011-6-9-2-ex.c:17:12: note: previous definition is here
//static int i5; // tentative definition, internal linkage
//           ^

extern int i1; // refers to previous, whose linkage is external
extern int i2; // refers to previous, whose linkage is internal
extern int i3; // refers to previous, whose linkage is external
extern int i4; // refers to previous, whose linkage is external
extern int i5; // refers to previous, whose linkage is interna

//Example 2
int i[];

int main(void)
{
return printf("6.9.2 External object definitions %d %d %d %d %d %d\n",i1,i2,i3,i4,i5,i[0]);	
}
// 1. LLVM(3.2) warning 
//c2011-6-9-2-ex.c:15:12: warning: 'extern' variable has an initializer [-Wextern-initializer]
//extern int i3 = 3; // definition, external linkage
//           ^
//c2011-6-9-2-ex.c:44:5: warning: tentative array definition assumed to have one element
//int i[];
//    ^
//2 warnings generated.
// 2. GCC4.9 warning 
//c2011-6-9-2-ex.c:15:12: warning: 'i3' initialized and declared 'extern' [enabled by default]
// extern int i3 = 3; // definition, external linkage
//            ^
//c2011-6-9-2-ex.c:44:5: warning: array 'i' assumed to have one element [enabled by default]
// int i[];
//     ^

// output may be
// 6.9.2 External object definitions 1 2 3 0 0 0
