1176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// RUN: %clang_cc1 -std=c99 -fsyntax-only -verify -pedantic %s
296e7813f08c6adf1d8657b0da86741b54e850fd7Rafael Espindola// RUN: not %clang_cc1 -E %s 2>&1 | grep 'blonk.c:92:2: error: ABC'
396e7813f08c6adf1d8657b0da86741b54e850fd7Rafael Espindola// RUN: not %clang_cc1 -E %s 2>&1 | grep 'blonk.c:93:2: error: DEF'
4359cc4475487ea0a660b3e8918334a2866e71c66Chris Lattner
5359cc4475487ea0a660b3e8918334a2866e71c66Chris Lattner#line 'a'            // expected-error {{#line directive requires a positive integer argument}}
6540f9ae1023bba27052c742cd92d0b32361b28ebFariborz Jahanian#line 0              // expected-warning {{#line directive with zero argument is a GNU extension}}
7540f9ae1023bba27052c742cd92d0b32361b28ebFariborz Jahanian#line 00             // expected-warning {{#line directive with zero argument is a GNU extension}}
8359cc4475487ea0a660b3e8918334a2866e71c66Chris Lattner#line 2147483648     // expected-warning {{C requires #line number to be less than 2147483648, allowed as extension}}
9359cc4475487ea0a660b3e8918334a2866e71c66Chris Lattner#line 42             // ok
10137b6a6149c53dbbcb8fba98e524d9ad0f3c8736Chris Lattner#line 42 'a'         // expected-error {{invalid filename for #line directive}}
11359cc4475487ea0a660b3e8918334a2866e71c66Chris Lattner#line 42 "foo/bar/baz.h"  // ok
12359cc4475487ea0a660b3e8918334a2866e71c66Chris Lattner
13359cc4475487ea0a660b3e8918334a2866e71c66Chris Lattner
148e60a29e25c9418522a072c7b959485f3c7bb2ecChris Lattner// #line directives expand macros.
158e60a29e25c9418522a072c7b959485f3c7bb2ecChris Lattner#define A 42 "foo"
168e60a29e25c9418522a072c7b959485f3c7bb2ecChris Lattner#line A
178e60a29e25c9418522a072c7b959485f3c7bb2ecChris Lattner
18478a18ec47fdb7e0e580a2635648456e9db9ad4fChris Lattner# 42
19478a18ec47fdb7e0e580a2635648456e9db9ad4fChris Lattner# 42 "foo"
20137b6a6149c53dbbcb8fba98e524d9ad0f3c8736Chris Lattner# 42 "foo" 2 // expected-error {{invalid line marker flag '2': cannot pop empty include stack}}
21137b6a6149c53dbbcb8fba98e524d9ad0f3c8736Chris Lattner# 42 "foo" 1 3  // enter
22137b6a6149c53dbbcb8fba98e524d9ad0f3c8736Chris Lattner# 42 "foo" 2 3  // exit
23137b6a6149c53dbbcb8fba98e524d9ad0f3c8736Chris Lattner# 42 "foo" 2 3 4 // expected-error {{invalid line marker flag '2': cannot pop empty include stack}}
24478a18ec47fdb7e0e580a2635648456e9db9ad4fChris Lattner# 42 "foo" 3 4
25478a18ec47fdb7e0e580a2635648456e9db9ad4fChris Lattner
26478a18ec47fdb7e0e580a2635648456e9db9ad4fChris Lattner# 'a'            // expected-error {{invalid preprocessing directive}}
27478a18ec47fdb7e0e580a2635648456e9db9ad4fChris Lattner# 42 'f'         // expected-error {{invalid filename for line marker directive}}
28478a18ec47fdb7e0e580a2635648456e9db9ad4fChris Lattner# 42 1 3         // expected-error {{invalid filename for line marker directive}}
29478a18ec47fdb7e0e580a2635648456e9db9ad4fChris Lattner# 42 "foo" 3 1   // expected-error {{invalid flag line marker directive}}
30478a18ec47fdb7e0e580a2635648456e9db9ad4fChris Lattner# 42 "foo" 42    // expected-error {{invalid flag line marker directive}}
31478a18ec47fdb7e0e580a2635648456e9db9ad4fChris Lattner# 42 "foo" 1 2   // expected-error {{invalid flag line marker directive}}
32ec27608da7f15b265135f5743fe71da1f8e25ee9Michael Ilseman# 42a33          // expected-error {{GNU line marker directive requires a simple digit sequence}}
33953b4b0950cb074156d66b45e8dab26725d4bccbChris Lattner
34953b4b0950cb074156d66b45e8dab26725d4bccbChris Lattner// These are checked by the RUN line.
35953b4b0950cb074156d66b45e8dab26725d4bccbChris Lattner#line 92 "blonk.c"
3678541c433049322b27b4f437973076ba29cff709Jordan Rose#error ABC
3778541c433049322b27b4f437973076ba29cff709Jordan Rose#error DEF
3878541c433049322b27b4f437973076ba29cff709Jordan Rose// expected-error@-2 {{ABC}}
3978541c433049322b27b4f437973076ba29cff709Jordan Rose#line 150
4078541c433049322b27b4f437973076ba29cff709Jordan Rose// expected-error@-3 {{DEF}}
41953b4b0950cb074156d66b45e8dab26725d4bccbChris Lattner
426b3066780bda02e3117d71a18ca2f430ed1454afChris Lattner
436b3066780bda02e3117d71a18ca2f430ed1454afChris Lattner// Verify that linemarker diddling of the system header flag works.
446b3066780bda02e3117d71a18ca2f430ed1454afChris Lattner
456b3066780bda02e3117d71a18ca2f430ed1454afChris Lattner# 192 "glomp.h" // not a system header.
466b3066780bda02e3117d71a18ca2f430ed1454afChris Lattnertypedef int x;  // expected-note {{previous definition is here}}
47c0004df84fca9225b66a50adc66cf21c34298227Douglas Gregortypedef int x;  // expected-warning {{redefinition of typedef 'x' is a C11 feature}}
486b3066780bda02e3117d71a18ca2f430ed1454afChris Lattner
496b3066780bda02e3117d71a18ca2f430ed1454afChris Lattner# 192 "glomp.h" 3 // System header.
506b3066780bda02e3117d71a18ca2f430ed1454afChris Lattnertypedef int y;  // ok
516b3066780bda02e3117d71a18ca2f430ed1454afChris Lattnertypedef int y;  // ok
526b3066780bda02e3117d71a18ca2f430ed1454afChris Lattner
53d0359af5113c1936ff3f699c7d700adff59351f2Chris Lattnertypedef int q;  // q is in system header.
54d0359af5113c1936ff3f699c7d700adff59351f2Chris Lattner
556b3066780bda02e3117d71a18ca2f430ed1454afChris Lattner#line 42 "blonk.h"  // doesn't change system headerness.
566b3066780bda02e3117d71a18ca2f430ed1454afChris Lattner
576b3066780bda02e3117d71a18ca2f430ed1454afChris Lattnertypedef int z;  // ok
586b3066780bda02e3117d71a18ca2f430ed1454afChris Lattnertypedef int z;  // ok
596b3066780bda02e3117d71a18ca2f430ed1454afChris Lattner
60bd16209c76e122d50b23af7f65067670946953d8Chris Lattner# 97     // doesn't change system headerness.
61bd16209c76e122d50b23af7f65067670946953d8Chris Lattner
62bd16209c76e122d50b23af7f65067670946953d8Chris Lattnertypedef int z1;  // ok
63bd16209c76e122d50b23af7f65067670946953d8Chris Lattnertypedef int z1;  // ok
64bd16209c76e122d50b23af7f65067670946953d8Chris Lattner
656b3066780bda02e3117d71a18ca2f430ed1454afChris Lattner# 42 "blonk.h"  // DOES change system headerness.
666b3066780bda02e3117d71a18ca2f430ed1454afChris Lattner
676b3066780bda02e3117d71a18ca2f430ed1454afChris Lattnertypedef int w;  // expected-note {{previous definition is here}}
68c0004df84fca9225b66a50adc66cf21c34298227Douglas Gregortypedef int w;  // expected-warning {{redefinition of typedef 'w' is a C11 feature}}
69ab82f41b217ce588a9456c0b4411f219d3ed0df8Chris Lattner
70d0359af5113c1936ff3f699c7d700adff59351f2Chris Lattnertypedef int q;  // original definition in system header, should not diagnose.
71ab82f41b217ce588a9456c0b4411f219d3ed0df8Chris Lattner
72ab82f41b217ce588a9456c0b4411f219d3ed0df8Chris Lattner// This should not produce an "extra tokens at end of #line directive" warning,
73ab82f41b217ce588a9456c0b4411f219d3ed0df8Chris Lattner// because #line is allowed to contain expanded tokens.
74ab82f41b217ce588a9456c0b4411f219d3ed0df8Chris Lattner#define EMPTY()
75ab82f41b217ce588a9456c0b4411f219d3ed0df8Chris Lattner#line 2 "foo.c" EMPTY( )
76ab82f41b217ce588a9456c0b4411f219d3ed0df8Chris Lattner#line 2 "foo.c" NONEMPTY( )  // expected-warning{{extra tokens at end of #line directive}}
77ab82f41b217ce588a9456c0b4411f219d3ed0df8Chris Lattner
7858e91d57510a5ce4fd424fe7fd1cdfa86701ef35Chris Lattner// PR3940
79dc8c90da158030c0d0c62539e2da0adccc09f271Chris Lattner#line 0xf  // expected-error {{#line directive requires a simple digit sequence}}
80dc8c90da158030c0d0c62539e2da0adccc09f271Chris Lattner#line 42U  // expected-error {{#line directive requires a simple digit sequence}}
81bc81682756a2406e1788b14c576b3c8b515d97a3Chris Lattner
82bc81682756a2406e1788b14c576b3c8b515d97a3Chris Lattner
83dc8c90da158030c0d0c62539e2da0adccc09f271Chris Lattner// Line markers are digit strings interpreted as decimal numbers, this is
84dc8c90da158030c0d0c62539e2da0adccc09f271Chris Lattner// 10, not 8.
85dc8c90da158030c0d0c62539e2da0adccc09f271Chris Lattner#line 010  // expected-warning {{#line directive interprets number as decimal, not octal}}
86dc8c90da158030c0d0c62539e2da0adccc09f271Chris Lattnerextern int array[__LINE__ == 10 ? 1:-1];
87dc8c90da158030c0d0c62539e2da0adccc09f271Chris Lattner
8860c99d34cf28c002718b61c2f058d1e84923a634Michael Ilseman# 020      // expected-warning {{GNU line marker directive interprets number as decimal, not octal}}
8960c99d34cf28c002718b61c2f058d1e84923a634Michael Ilsemanextern int array_gnuline[__LINE__ == 20 ? 1:-1];
9060c99d34cf28c002718b61c2f058d1e84923a634Michael Ilseman
91dff070fb0f2880806ef1ae5471ace37a97dd9e6aChris Lattner/* PR3917 */
92dff070fb0f2880806ef1ae5471ace37a97dd9e6aChris Lattner#line 41
93dff070fb0f2880806ef1ae5471ace37a97dd9e6aChris Lattnerextern char array2[\
94dff070fb0f2880806ef1ae5471ace37a97dd9e6aChris Lattner_\
95dff070fb0f2880806ef1ae5471ace37a97dd9e6aChris Lattner_LINE__ == 42 ? 1: -1];  /* line marker is location of first _ */
96dff070fb0f2880806ef1ae5471ace37a97dd9e6aChris Lattner
9760c99d34cf28c002718b61c2f058d1e84923a634Michael Ilseman# 51
9860c99d34cf28c002718b61c2f058d1e84923a634Michael Ilsemanextern char array2_gnuline[\
9960c99d34cf28c002718b61c2f058d1e84923a634Michael Ilseman_\
10060c99d34cf28c002718b61c2f058d1e84923a634Michael Ilseman_LINE__ == 52 ? 1: -1];  /* line marker is location of first _ */
10160c99d34cf28c002718b61c2f058d1e84923a634Michael Ilseman
102540f9ae1023bba27052c742cd92d0b32361b28ebFariborz Jahanian// rdar://11550996
103540f9ae1023bba27052c742cd92d0b32361b28ebFariborz Jahanian#line 0 "line-directive.c" // expected-warning {{#line directive with zero argument is a GNU extension}}
104540f9ae1023bba27052c742cd92d0b32361b28ebFariborz Jahanianundefined t; // expected-error {{unknown type name 'undefined'}}
105dff070fb0f2880806ef1ae5471ace37a97dd9e6aChris Lattner
106dff070fb0f2880806ef1ae5471ace37a97dd9e6aChris Lattner
107