tcc -dt -run ... : simpler is better

* -dt now with lowercase t

* test snippets now separated by real preprocessor statements
  which is valid C also for other compilers

    #if defined test_xxx
       < test snippet x >
    #elif defined test_yyy
       < test snippet y >
    #elif ...
    #endif

* simpler implementation, behaves like -run if no 'test_...' macros
  are seen, works with -E too

* for demonstration I combined some of the small tests for errors
  and warnings (56..63,74) in "60_errors_and_warnings.c"

Also:
* libtcc.c:
  put tcc_preprocess() and tcc_assemble() under the setjmp clause
  to let them return to caller after errors.  This is for -dt -E.
* tccgen.c:
  - get rid of save/restore_parse_state(), macro_ptr is saved
    by begin_macro anyway, now line_num too.
  - use expr_eq for parsing _Generic's controlling_type
  - set nocode_wanted with const_wanted. too, This is to keep
    VT_JMP on vtop when parsing preprocessor expressions.
* tccpp.c: tcc -E: suppress trailing whitespace from lines with
  comments (that -E removes) such as
       NO_GOTPLT_ENTRY,\t    /* never generate ... */
This commit is contained in:
grischka
2017-07-20 22:21:27 +02:00
parent ba2b25e4ea
commit 0cc24d0e84
31 changed files with 323 additions and 446 deletions

View File

@@ -1 +0,0 @@
struct A {} int i;

View File

@@ -1 +0,0 @@
56_btype_excess-1.c:1: error: too many basic types

View File

@@ -1 +0,0 @@
char int i;

View File

@@ -1 +0,0 @@
57_btype_excess-2.c:1: error: too many basic types

View File

@@ -1,9 +0,0 @@
int f(void)
{
return 0;
}
int f(void)
{
return 1;
}

View File

@@ -1 +0,0 @@
58_function_redefinition.c:7: error: redefinition of 'f'

View File

@@ -1 +0,0 @@
int (*fct)[42](int x);

View File

@@ -1 +0,0 @@
59_function_array.c:1: error: declaration of an array of functions

View File

@@ -1,4 +0,0 @@
enum color {RED, GREEN, BLUE};
enum color {R, G, B};
enum color c;

View File

@@ -1 +0,0 @@
60_enum_redefinition.c:2: error: struct/union/enum already defined

View File

@@ -0,0 +1,51 @@
#if defined test_56_btype_excess_1
struct A {} int i;
#elif defined test_57_btype_excess_2
char int i;
#elif defined test_58_function_redefinition
int f(void) { return 0; }
int f(void) { return 1; }
#elif defined test_global_redefinition
int xxx = 1;
int xxx;
int xxx = 2;
#elif defined test_59_function_array
int (*fct)[42](int x);
#elif defined test_60_enum_redefinition
enum color { RED, GREEN, BLUE };
enum color { R, G, B };
enum color c;
#elif defined test_62_enumerator_redefinition
enum color { RED, GREEN, BLUE };
enum rgb { RED, G, B};
enum color c = RED;
#elif defined test_63_local_enumerator_redefinition
enum {
FOO,
BAR
};
int main(void)
{
enum {
FOO = 2,
BAR
};
return BAR - FOO;
}
#elif defined test_61_undefined_enum
enum rgb3 c = 42;
#elif defined test_74_non_const_init
int i = i++;
#endif

View File

@@ -0,0 +1,28 @@
[test_56_btype_excess_1]
60_errors_and_warnings.c:2: error: too many basic types
[test_57_btype_excess_2]
60_errors_and_warnings.c:5: error: too many basic types
[test_58_function_redefinition]
60_errors_and_warnings.c:9: error: redefinition of 'f'
[test_global_redefinition]
60_errors_and_warnings.c:14: error: redefinition of 'xxx'
[test_59_function_array]
60_errors_and_warnings.c:17: error: declaration of an array of functions
[test_60_enum_redefinition]
60_errors_and_warnings.c:21: error: struct/union/enum already defined
[test_62_enumerator_redefinition]
60_errors_and_warnings.c:26: error: redefinition of enumerator 'RED'
[test_63_local_enumerator_redefinition]
[test_61_undefined_enum]
60_errors_and_warnings.c:46: error: unknown type size
[test_74_non_const_init]
60_errors_and_warnings.c:49: error: initializer element is not constant

View File

@@ -1 +0,0 @@
enum rgb c = 42;

View File

@@ -1 +0,0 @@
61_undefined_enum.c:1: error: unknown type size

View File

@@ -1,4 +0,0 @@
enum color {RED, GREEN, BLUE};
enum rgb {RED, G, B};
enum color c = RED;

View File

@@ -1 +0,0 @@
62_enumerator_redefinition.c:2: error: redefinition of enumerator 'RED'

View File

@@ -1,14 +0,0 @@
enum {
FOO,
BAR
};
int main(void)
{
enum {
FOO = 2,
BAR
};
return BAR - FOO;
}

View File

@@ -1 +0,0 @@
int i = i++;

View File

@@ -1 +0,0 @@
74_nocode_wanted.c:1: error: initializer element is not constant

View File

@@ -1,36 +1,35 @@
/*****************************************************************************/
/* test 'nodata_wanted' data output suppression */
/*-* test 1: initializer not computable 1 */
#if defined test_static_data_error
void foo() {
if (1) {
static short w = (int)&foo; /* error */
static short w = (int)&foo; /* initializer not computable */
}
}
/*-* test 2: initializer not computable 2 */
#elif defined test_static_nodata_error
void foo() {
if (0) {
static short w = (int)&foo; /* error */
static short w = (int)&foo; /* initializer not computable */
}
}
/*-* test 3: initializer not computable 3 */
#elif defined test_global_data_error
void foo();
static short w = (int)&foo; /* error */
static short w = (int)&foo; /* initializer not computable */
/*-* test 4: 2 cast warnings */
#elif defined test_local_data_noerror
void foo() {
short w = &foo; /* no error */
short w = &foo; /* 2 cast warnings */
}
/*-* test 5; nodata_wanted test */
#elif defined test_data_suppression
#include <stdio.h>
#define DATA_LBL(s) \
__asm__(".global d"#s",t"#s"\n.data\nd"#s":\n.text\nt"#s":\n"); \
extern char d##s[],t##s[];
#define ASMLABELS(s) \
__asm__(".global d"#s",t"#s"\n.data\nd"#s":\n.text\nt"#s":\n")
#define PROG \
static void *p = (void*)&main;\
@@ -47,28 +46,29 @@ void foo() {
int main()
{
extern char ds1[],ts1[];
extern char ds2[],ts2[];
extern char de1[],te1[];
extern char de2[],te2[];
printf("suppression off\n");
DATA_LBL(s1);
if (1) {
ASMLABELS(s1);
PROG
ASMLABELS(e1);
}
DATA_LBL(e1);
printf(" data length is %s\n", de1 - ds1 ? "not 0":"0");
//printf(" text length is %s\n", te1 - ts1 ? "not 0":"0");
printf(" text length is %s\n", te1 - ts1 ? "not 0":"0");
printf("suppression on\n");
DATA_LBL(s2);
if (0) {
ASMLABELS(s2);
PROG
ASMLABELS(e2);
}
DATA_LBL(e2);
printf(" data length is %x\n", de2 - ds2);
//printf(" text length is %X\n", te2 - ts2);
printf(" text length is %X\n", te2 - ts2);
return 0;
}
/*-* test 6: some test */
int main()
{
return 34;
}
#endif

View File

@@ -1,24 +1,22 @@
/*-* test 1: initializer not computable 1 */
test 1:3: error: initializer element is not computable at load time
[test_static_data_error]
96_nodata_wanted.c:7: error: initializer element is not computable at load time
/*-* test 2: initializer not computable 2 */
test 2:3: error: initializer element is not computable at load time
[test_static_nodata_error]
96_nodata_wanted.c:14: error: initializer element is not computable at load time
/*-* test 3: initializer not computable 3 */
test 3:2: error: initializer element is not computable at load time
[test_global_data_error]
96_nodata_wanted.c:20: error: initializer element is not computable at load time
/*-* test 4: 2 cast warnings */
test 4:2: warning: assignment makes integer from pointer without a cast
test 4:2: warning: nonportable conversion from pointer to char/short
[test_local_data_noerror]
96_nodata_wanted.c:25: warning: assignment makes integer from pointer without a cast
96_nodata_wanted.c:25: warning: nonportable conversion from pointer to char/short
/*-* test 5; nodata_wanted test */
[test_data_suppression]
suppression off
static data: 8 - 8.0 - 8.0 - main - static string
static bitfields: 333 44 555555 6 7
data length is not 0
text length is not 0
suppression on
data length is 0
returns 0
/*-* test 6: some test */
returns 34
text length is 0

View File

@@ -20,7 +20,7 @@ endif
ifeq (,$(filter i386 x86_64,$(ARCH)))
SKIP += 85_asm-outside-function.test
endif
ifeq (-$(findstring gcc,$(CC)-)-,--)
ifeq (-$(findstring gcc,$(CC))-,--)
SKIP += $(patsubst %.expect,%.test,$(GEN-ALWAYS))
endif
ifeq (-$(CONFIG_WIN32)-$(CONFIG_i386)$(CONFIG_arm)-,--yes-)
@@ -40,8 +40,9 @@ NORUN =
FLAGS =
76_dollars_in_identifiers.test : FLAGS += -fdollars-in-identifiers
# run the source file cut into snippets
96_nodata_wanted.test : FLAGS = -dT
# These tests run several snippets from the same file one by one
60_errors_and_warnings.test : FLAGS += -dt
96_nodata_wanted.test : FLAGS += -dt
# Always generate certain .expects (don't put these in the GIT),
GEN-ALWAYS =
@@ -90,8 +91,8 @@ F2 = $1 UPDATE="$(patsubst %.test,%.expect,$1)"
@$(call GEN,$(SRC)/$*.c) $(FILTER) >$@ 2>&1
@rm -f *.exe *.obj *.pdb
# using TCC for .expect if -dT in FLAGS
GEN = $(if $(findstring -dT,$(FLAGS)),$(GEN-TCC),$(GEN-CC))
# using TCC for .expect if -dt in FLAGS
GEN = $(if $(filter -dt,$(FLAGS)),$(GEN-TCC),$(GEN-CC))
GEN-CC = $(CC) -w -std=gnu99 $(FLAGS) $1 -o a.exe && ./a.exe $(ARGS)
GEN-TCC = $(TCC) $(FLAGS) -run $1 $(ARGS)
GEN-MSC = $(MS-CC) $1 && ./$(basename $@).exe