aboutsummaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
* Rename -Wall to Wsparse-all, so it doesn't get turned on unintentionallyJosh Triplett2010-03-284-17/+8
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | sparse's -Wall option turns on all sparse warnings, including those that many projects will not want; for instance, warnings that enforce particular stylistic choices, or behavior allowed by a standard but considered questionable or error-prone. Furthermore, using -Wall means accepting all future warnings sparse may start issuing, not just those intentionally turned on by default. Other compilers like GCC also use -Wall, and interpret it to mean "turn on a sensible set of warnings". Since sparse exists to emit warnings, it already defaults to emitting a sensible set of warnings. Many projects pass the same options to both sparse and the C compiler, including warning options like -Wall; this results in turning on excessive amounts of sparse warnings. cgcc already filtered out -Wall, but many projects invoke sparse directly rather than using cgcc. Remove that filter, now that -Wall does not change sparse's behavior. Projects almost certainly don't want to use the new -Wsparse-all option; they should choose the specific set of warnings they want, or just go with sparse's defaults. Also update cgcc to know about Wsparse-all and not pass it to GCC, and update a test case that unnecessarily used -Wall. Signed-off-by: Josh Triplett <josh@joshtriplett.org> Signed-off-by: Christopher Li <sparse@chrisli.org>
* Handle __builtin_ms_va_list.Michael Stefaniuc2010-03-282-0/+3
| | | | | | | | | | | | | | | | | | | | | | For Win64 compiles Wine does #ifndef __ms_va_list # if defined(__x86_64__) && defined (__GNUC__) # define __ms_va_list __builtin_ms_va_list # define __ms_va_start(list,arg) __builtin_ms_va_start(list,arg) # define __ms_va_end(list) __builtin_ms_va_end(list) # else Wouldn't be as bad if sparse cannot handle those but it trips over WINBASEAPI DWORD WINAPI FormatMessageA(DWORD,LPCVOID,DWORD,DWORD,LPSTR,DWORD,__ms_va_list*); WINBASEAPI DWORD WINAPI FormatMessageW(DWORD,LPCVOID,DWORD,DWORD,LPWSTR,DWORD,__ms_va_list*); producing this errors for basically every file: wine/include/winbase.h:1546:96: error: Expected ) in function declarator wine/include/winbase.h:1546:96: error: got * wine/include/winbase.h:1547:97: error: Expected ) in function declarator wine/include/winbase.h:1547:97: error: got * Signed-off-by: Michael Stefaniuc <mstefaniuc@gmail.com> Signed-off-by: Christopher Li <sparse@chrisli.org>
* Simplify Makefile using static pattern rulesChristopher Li2010-03-281-8/+3
| | | | | | | I find a way to get rid of the macro and $$ in linking executable program. Signed-off-by: Christopher Li <sparse@chrisli.org>
* Ignore the alloc_size attribute.Michael Stefaniuc2010-03-281-0/+2
| | | | | | | | | Wine has annotated the Win32 alloc functions with the alloc_size attribute. This cuts down the noise a lot when running sparse on the Wine source code. Signed-off-by: Michael Stefaniuc <mstefaniuc@gmail.com> Signed-off-by: Christopher Li <sparse@chrisli.org>
* Ignore the ms_abi/sysv_abi attributes.Michael Stefaniuc2010-03-281-0/+4
| | | | | | | | | | | | | This is needed for getting a meaningful sparse run on a Wine 64-bit compile. Else the basic Win32 headers will produce tons of error: attribute 'ms_abi': unknown attribute which end in error: too many errors. The sysv_abi attribute was just added for symmetry. Signed-off-by: Michael Stefaniuc <mstefaniuc@gmail.com> Signed-off-by: Christopher Li <sparse@chrisli.org>
* Declare ignored attributres into a list of string.Christopher Li2010-03-282-71/+86
| | | | | | Adding ignored attributes is much easier now. Signed-off-by: Christopher Li <sparse@chrisli.org>
* Move noreturn attribute out of ignore attr areaChristopher Li2010-03-281-2/+2
| | | | Signed-off-by: Christopher Li <sparse@chrisli.org>
* Make MOD_NORETURN fits into 32 bitChristopher Li2009-10-161-1/+1
| | | | | | | It is causing compiler warning on 32 bit systems. Move it to lower bits fix it. Signed-off-by: Christopher Li <sparse@chrisli.org>
* do not ignore attribute 'noreturn'...Kamil Dudka2009-10-162-3/+5
| | | | | | | | | | | | | | | | | | | | | Hello, enclosed is a simple patch adding support for attribute 'noreturn' to the parser. The enhancement makes it possible to optimize walk through CFG and thus help us to fight with the state explosion. The benefit is demonstrated on a simple real-world example. Generated CFG before patch: http://dudka.cz/devel/html/slsparse-before/slplug.c-handle_stmt_assign.svg Generated CFG after patch: http://dudka.cz/devel/html/slsparse-after/slplug.c-handle_stmt_assign.svg It's one of the key features I am currently missing in SPARSE in contrast to gcc used as parser. Thanks in advance for considering it! Signed-off-by: Kamil Dudka <kdudka@redhat.com> Signed-off-by: Christopher Li <sparse@chrisli.org>
* Sparse 0.4.2Christopher Li2009-10-111-2/+2
| | | | Signed-off-by: Christopher Li <sparse@chrisli.org>
* sparse: Add GCC pre-defined macros for user-spacePekka Enberg2009-08-212-0/+11
| | | | | | | | | | | | | | | | | | | Sparse produces a bunch of warnings like this when compiling against glibc: /usr/lib/gcc/i486-linux-gnu/4.3.2//include-fixed/limits.h:33:22: warning: undefined preprocessor identifier '__INT_MAX__' /usr/lib/gcc/i486-linux-gnu/4.3.2//include-fixed/limits.h:64:5: warning: undefined preprocessor identifier '__SHRT_MAX__' /usr/lib/gcc/i486-linux-gnu/4.3.2//include-fixed/limits.h:64:21: warning: undefined preprocessor identifier '__INT_MAX__' /usr/include/bits/xopen_lim.h:95:6: warning: undefined preprocessor identifier '__INT_MAX__' /usr/include/bits/xopen_lim.h:98:7: warning: undefined preprocessor identifier '__INT_MAX__' Fix that up by adding some add_pre_buffer() calls to create_builtin_define(). For future reference, GCC defines the builtins in the c_cpp_builtins() function in gcc/c-cppbuiltin.c. Signed-off-by: Pekka Enberg <penberg@cs.helsinki.fi> Acked-by: Josh Triplett <josh@joshtriplett.org> Signed-off-by: Christopher Li <sparse@chrisli.org>
* make sparse headers self-compilable...Kamil Dudka2009-08-115-0/+14
| | | | | | | | ... and thus possible to include them in arbitrary order and without any external dependencies. Signed-off-by: Kamil Dudka <kdudka@redhat.com> Signed-off-by: Christopher Li <sparse@chrisli.org>
* show_token: handle TOKEN_UNTAINT and TOKEN_ARG_COUNT typesReinhard Tartler2009-08-111-2/+11
| | | | | | | | These cases are probably never hit with "regular" codepaths, but are useful when called in a gdb session to print token sequences. Signed-off-by: Reinhard Tartler <siretart@tauware.de> Signed-off-by: Christopher Li <sparse@chrisli.org>
* unssa: track uses when replacing a phi nodeKamil Dudka2009-08-023-1/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Hello, attached are patch, testing input for test-unssa and its outputs before patch and after patch. Thanks in advance for considering the patch! Kamil test: .L0x7f9fb2030010 <entry-point> phisrc.32 %phi2(ptr) <- %arg1 br .L0x7f9fb2030130 .L0x7f9fb2030130 copy.32 %r1(ptr) <- %r5(ptr) br %r1(ptr), .L0x7f9fb2030058, .L0x7f9fb20300e8 .L0x7f9fb2030058 load.32 %r3 <- 0[%r1(ptr)] phisrc.32 %phi3(ptr) <- %r3 br .L0x7f9fb2030130 .L0x7f9fb20300e8 ret test: .L0x7f4a7f7f1010 <entry-point> copy.32 %r5(ptr) <- %arg1 br .L0x7f4a7f7f1130 .L0x7f4a7f7f1130 copy.32 %r1(ptr) <- %r5(ptr) br %r1(ptr), .L0x7f4a7f7f1058, .L0x7f4a7f7f10e8 .L0x7f4a7f7f1058 load.32 %r3 <- 0[%r1(ptr)] copy.32 %r5(ptr) <- %r3 br .L0x7f4a7f7f1130 .L0x7f4a7f7f10e8 ret >From 66a02fa7cec780fc88d6ef4cce7a1e704928808a Mon Sep 17 00:00:00 2001 From: Kamil Dudka <kdudka@redhat.com> Date: Sun, 9 Aug 2009 10:22:11 +0200 Subject: [PATCH] unssa: track uses when replacing a phi node The output of test-unssa is inconsistent for a simple test-case without this patch: static void test(void **ptr) { while (ptr) { ptr = *ptr; } } Signed-off-by: Kamil Dudka <kdudka@redhat.com> Signed-off-by: Christopher Li <sparse@chrisli.org>
* Define __LP64__ for x86_64 unless in 32 bit modeBlue Swirl2009-08-011-1/+1
| | | | | Signed-off-by: Blue Swirl <blauwirbel@gmail.com> Signed-off-by: Christopher Li <sparse@chrisli.org>
* Add support for TImode type (__int128_t)Blue Swirl2009-08-0110-13/+51
| | | | | | | | | | GCC provides a 128 bit type called internally as TImode (__int128_t)on 64 bit platforms (at least x86_64 and Sparc64). These types are used by OpenBIOS. Add support for types "long long long", __mode__(TI) and __(u)int128_t. Signed-off-by: Blue Swirl <blauwirbel@gmail.com> Signed-off-by: Christopher Li <sparse@chrisli.org>
* linearize.h: sanitize headerKamil Dudka2009-07-292-4/+4
| | | | | | | | | | It's unfortunate to use 'true' and 'false' as identifiers in a system header. It clashes with corresponding macros from <stdbool.h> when included before <sparse/linearize.h>. Signed-off-by: Kamil Dudka <kdudka@redhat.com> Acked-by: Hannes Eder <hannes@hanneseder.net> Signed-off-by: Christopher Li <sparse@chrisli.org>
* Add c{l,t}z{,l,ll}, ffsl{,l}, popcountll and floating point comparison builtins.Blue Swirl2009-08-031-3/+22
| | | | | Signed-off-by: Blue Swirl <blauwirbel@gmail.com> Signed-off-by: Christopher Li <sparse@chrisli.org>
* Ignore attribute __bounded__, used by OpenBSD headers.Blue Swirl2009-08-031-0/+2
| | | | | Signed-off-by: Blue Swirl <blauwirbel@gmail.com> Signed-off-by: Christopher Li <sparse@chrisli.org>
* test-suite: integrate unhandled proprocessor testsHannes Eder2009-07-279-0/+142
| | | | | | | | Instrument validate/preprocessor/preproprocessor*.c to be integrated into the test-suite where missing and add an additional test case. Signed-off-by: Hannes Eder <hannes@hanneseder.net> Signed-off-by: Christopher Li <sparse@chrisli.org>
* compile-i386: do not generate an infinite loopKamil Dudka2009-07-221-4/+4
| | | | | | | | | | | | I've probably encountered a bug within compile-i386.c. It generates an infinite loop for 'while' statement. My testing example and proposed patch are enclosed. Kamil Signed-off-by: Kamil Dudka <kdudka@redhat.com> Acked-by: Jeff Garzik <jgarzik@redhat.com> Signed-off-by: Christopher Li <sparse@chrisli.org>
* Makefile: suppress error message from pkg-configRamsay Jones2009-07-201-1/+1
| | | | | | | | | | | | In particular, on systems which do not have 'pkg-config' installed, every invocation of make issues the following message: /bin/sh: pkg-config: command not found Suppress the message by redirecting stderr to the bit-bucket. Signed-off-by: Ramsay Jones <ramsay@ramsay1.demon.co.uk> Signed-off-by: Christopher Li <sparse@chrisli.org>
* test-suite: be more verbose on 'unhandled' and 'known to fail' testsHannes Eder2009-07-191-1/+5
| | | | | | | | | Impact: - On an 'unhandled' test issue a warning, and - in case of a 'known to fail' test a info message. Signed-off-by: Hannes Eder <hannes@hanneseder.net> Signed-off-by: Christopher Li <sparse@chrisli.org>
* move extern inline function to file scopeChristopher Li2009-07-194-6/+40
| | | | | | | | | In gcc extern inline function has special meaning. The inline function will never emit stand alone copy of the function. It also allow multiple implementations cross different file. That effectively makes the extern inline has file scope. Signed-off-by: Christopher Li <sparse@chrisli.org>
* Add validation for restrict and attribute warningChristopher Li2009-07-182-0/+20
| | | | | | Some simple test to excise the recent patch. Signed-off-by: Christopher Li <sparse@chrisli.org>
* Avoid "attribute 'warning': unknown attribute" warningLinus Torvalds2009-07-181-0/+2
| | | | | | | | | | | | | This avoids getting annoying warnings from <curl/typecheck-gcc.h> and from <bits/string3.h>, which use the "__attribute__((__warning__ (msg)))" gcc attribute. [ The attribute causes gcc to print out the supplied warning message if the function is used. We should some day support it, but this patch just makes us ignore it. ] Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Christopher Li <sparse@chrisli.org>
* Turn off '-Wtransparent-union' by defaultLinus Torvalds2009-07-181-1/+1
| | | | | | | | | | | | | | | | | | | | | | It's a very annoying warning, and it's about a sparse limitation rather than a real feature, so don't do it by default. Sure, our lack of transparent union support will then make us warn about the magic calling convention hacks (eg you'll see warnings like connect.c:240:39: warning: incorrect type in argument 2 (invalid types) connect.c:240:39: expected union __CONST_SOCKADDR_ARG [usertype] __addr connect.c:240:39: got struct sockaddr *ai_addr but it still doesn't mean that we have to be so noisy about just seeing those transparent unions. One annoying warning is not an argument for doing _another_ annoying warning too (and the calling convention warnings at least only happen if you actually use them, unlike the transparent union warning that happens every time we see one, used or not). Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Christopher Li <sparse@chrisli.org>
* Allow array declarators to have 'restrict' in themLinus Torvalds2009-07-182-0/+3
| | | | | | | | | | | | Otherwise sparse is very unhappy about the current glibc header files (aio.h, netdb.h. regex.h and spawn.h at a minimum). It's a hack, and not a proper parsing with saving the information. It just ignores any "restrict" keyword at the start of an abstract array declaration, but it's better than what we have now. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Christopher Li <sparse@chrisli.org>
* Have Makefile import local.mk if it exists.Samuel Bronson2009-07-182-2/+12
| | | | | | | | This will allow users to override build settings without dirtying their trees, making life with `git stash' a bit easier. Signed-off-by: Samuel Bronson <naesten@gmail.com> Signed-off-by: Christopher Li <sparse@chrisli.org>
* Support the __thread storage classAlberto Bertogli2009-07-182-4/+33
| | | | | | | | | | GCC supports a __thread storage class, used to indicate thread-local storage. It may be used alone, or with extern or static. This patch makes sparse aware of it, and check those restrictions. Signed-off-by: Alberto Bertogli <albertito@blitiri.com.ar> Signed-off-by: Christopher Li <sparse@chrisli.org>
* Print an error if typeof() lacks an argumentMartin Nagy2009-07-182-1/+19
| | | | | | | | We weren't checking if the initializer isn't NULL, which caused sparse to segfault later on when performing lazy evaluation in classify_type(). Signed-off-by: Martin Nagy <nagy.martin@gmail.com> Signed-off-by: Christopher Li <sparse@chrisli.org>
* Add missing checks for Waddress-spaceMartin Nagy2009-07-182-5/+5
| | | | | | | | | | Remove all previous checks for Waddress_space and add one centralized to the address_space attribute handler. If user passes the -Wno-address-space option, we behave as if every pointer had no address space. Signed-off-by: Martin Nagy <nagy.martin@gmail.com> Signed-off-by: Christopher Li <sparse@chrisli.org>
* .gitignore: Ignore dependencies and Vim swap filesMartin Nagy2009-07-181-0/+2
| | | | | Signed-off-by: Martin Nagy <nagy.martin@gmail.com> Signed-off-by: Christopher Li <sparse@chrisli.org>
* warn directive in argument listAl Viro2009-07-181-2/+26
| | | | | | | | | | | | | | | | | On Sat, Mar 21, 2009 at 04:40:20AM +0000, Al Viro wrote: > > Well... patch below would give more or less close approximation to the > current set of nasal demons produced by gcc in these situations + error > when that crap happens. > Warning: it might make things slower, and it needs testing. > > --- It needed testing, all right - #elif handling got broken by the initial variant... Hopefully fixed version follows: Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Christopher Li <sparse@chrisli.org>
* Segfault at evaluate.c:341Al Viro2009-07-181-0/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | On Thu, Mar 19, 2009 at 09:52:50PM +0000, Al Viro wrote: Yeah... It's an old b0rken handling of calls for K&R + changes that exposed that even worse. Status quo is restored by the patch below, but it's a stopgap - e.g. void f(); void g(void) { f(0, 0); } will warn about extra arguments as if we had void f(void); as sparse had been doing all along. B0rken. Testcase for the segfault is void f(x, y); void g(void) { f(0, 0); } Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Christopher Li <sparse@chrisli.org>
* Sanitize pointer()Al Viro2009-07-181-15/+5
| | | | | | | | | There's no need to concat the context list into (empty) one of new node, only to free the original one. Moving the pointer to list instead works fine... Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Christopher Li <chrisl@hera.kernel.org>
* Don't mix storage class bits with ctype->modifiers while parsing typeAl Viro2009-07-185-43/+86
| | | | | | | | | | | | | Keep storage class (and "is it inline") explicitly in decl_state; translate to modifiers only when we are done with parsing. That avoids the need to separate MOD_STORAGE bits while constructing the type (e.g. in alloc_indirect_symbol(), etc.). It also allows to get rid of MOD_FORCE for good - instead of passing it to typename() we pass an int * and let typename() tell whether we'd got a force-cast. Indication of force-cast never makes it into the modifier bits at all. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Christopher Li <chrisl@hera.kernel.org>
* Simplify get_number_value() and ctype_integer()Al Viro2009-07-183-32/+23
| | | | | | | | | | | There's no point whatsoever in constructing modifiers for chosen type when decoding integer constant only to have them picked apart by ctype_integer(). Seeing that the former is the only caller of the latter these days, we can bloody well just pass the rank and signedness explicitly and save a lot of efforts. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Christopher Li <chrisl@hera.kernel.org>
* Fix __label__ handlingAl Viro2009-07-185-32/+40
| | | | | | | | | | | | a) __label__ in gcc is not a type, it's a statement. Accepted in the beginning of compound-statement, has form __label__ ident-list; b) instead of crapping into NS_SYMBOL namespace (and consequent shadowing issues), reassign the namespace to NS_LABEL after we'd bound it. We'll get block scope and label namespace, i.e. what we get in gcc. c) MOD_LABEL can be dropped now. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Christopher Li <sparse@chrisli.org>
* Fix declaration_specifiers() handling of typedef name shadowed by NS_SYMBOLAl Viro2009-07-183-3/+16
| | | | | | | | | | | | | | | | | | | | | Doing lookup_symbol() with NS_TYPEDEF will happily skip the redeclarations of the same identifier with NS_SYMBOL. We need to check that we are not dealing with something like typedef int T; void f(int T) { static T a; /* not a valid declaration - T is not a typedef name */ or similar (e.g. enum member shadowing a typedef, etc.). While we are at it, microoptimize similar code in lookup_type() - instead of sym->namespace == NS_TYPEDEF we can do sym->namespace & NS_TYPEDEF; the former will turn into "fetch 32bit value, mask all but 9 bits, compare with NS_TYPEDEF", the latter - "check that one bit in 32bit value is set". We never mix NS_TYPEDEF with anything in whatever->namespace, so the tests are equivalent. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Christopher Li <sparse@chrisli.org>
* Fix enumeration constants' scope beginningAl Viro2009-07-182-4/+14
| | | | | | | | | | | | | | It starts after the end of enumerator; i.e. if we have enum { ... Foo = expression, ... }; the scope of Foo starts only after the end of expression. Rationale: 6.2.1p7. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Christopher Li <sparse@chrisli.org>
* Restore __attribute__((mode)) handlingAl Viro2009-07-183-22/+101
| | | | | | | | | | | ... at least to the extent we used to do it. It still does _not_ cover the perversions gcc can do with that, but at least it deals with regressions. Full solution will have to wait for full-blown imitation of what gcc people call __attribute__ semantics, the bastards... Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Christopher Li <sparse@chrisli.org>
* Pass decl_state down to ->attribute()Al Viro2009-07-182-19/+20
| | | | | Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Christopher Li <sparse@chrisli.org>
* Pass decl_state down to ->declarator() and handle_attributes()Al Viro2009-07-172-49/+49
| | | | | | | | | | | Other than for attributes of labels (completely ignored, and we can simply use skip_attributes() there), all callers of handle_attributes actually get ctype == &ctx->ctype for some ctx. Ditto for ->declarator(). Switch both to passing ctx instead (has to be done at the same time, since we have handle_attributes() called from ->declarator() for struct). Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Christopher Li <sparse@chrisli.org>
* Clean up and split declaration_specifiers()Al Viro2009-07-171-30/+29
| | | | | | | | | At this point there's not much in common between qualifiers-only and full cases; easier to split the sucker in two and lose the qual argument. Clean it up, while we are at it... Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Christopher Li <sparse@chrisli.org>
* Have ->declarator() act directly on ctype being affectedAl Viro2009-07-172-73/+162
| | | | | | | ... and don't do full-blown apply_ctype() every damn time. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Christopher Li <sparse@chrisli.org>
* Rewrite and fix specifiers handlingAl Viro2009-07-176-166/+468
| | | | | | | | | | | | | | | | | | | | Make sure that we accept the right set; kill ad-hackery around checks for banned combinations. Instead of that we keep a bitmap describing what we'd already seen (with several extra bits for 'long long' and for keeping track of can't-combine-with-anything stuff), check and update it using the values in ..._op and keep track of size modifiers more or less explicitly. Testcases added. A _lot_ of that used to be done wrong. Note that __attribute__((mode(...))) got more broken by this one; the next several changesets will take care of that. One more thing: we are -><- close to getting rid of MOD_SPECIFIER bits for good. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Christopher Li <sparse@chrisli.org>
* Saner type for __builtin_va_listAl Viro2009-07-171-1/+1
| | | | | Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Christopher Li <sparse@chrisli.org>
* Take the rest of specifiers to parse.cAl Viro2009-07-173-44/+33
| | | | | | | ... and yes, right now it's ucking fugly. Will get sanitized shortly. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Christopher Li <sparse@chrisli.org>
* preparations to ->declarator() cleanup - separate typedef handlingAl Viro2009-07-171-9/+11
| | | | | | | | | | Take typedef handling in declaration_specifiers() into separate branch; kill useless check for qual in case the type we've got has non-NULL base_type (we'd have already buggered off in that situation before we get to the check in question). Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Christopher Li <sparse@chrisli.org>