diff options
author | Rafael Zalamena <rzalamena@opensourcerouting.org> | 2022-11-28 12:19:59 +0100 |
---|---|---|
committer | Rafael Zalamena <rzalamena@opensourcerouting.org> | 2022-11-28 12:21:25 +0100 |
commit | a0823246493f72cf87a04595b219cf34dd976ad4 (patch) | |
tree | 3953709589b1f83868016f29069f7d4094f52569 /lib | |
parent | Merge pull request #12317 from mobash-rasool/ospf-fixes (diff) | |
download | frr-a0823246493f72cf87a04595b219cf34dd976ad4.tar.xz frr-a0823246493f72cf87a04595b219cf34dd976ad4.zip |
lib: handle visual studio code C/C++ extension
Add some `pragma`s to handle errors that the C/C++ extension is not able
to understand.
Move `TRANSPARENT_UNION` to `lib/compiler.h` for consistency.
Signed-off-by: Rafael Zalamena <rzalamena@opensourcerouting.org>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/compiler.h | 39 | ||||
-rw-r--r-- | lib/prefix.h | 16 |
2 files changed, 39 insertions, 16 deletions
diff --git a/lib/compiler.h b/lib/compiler.h index bf443906e..514f0cee6 100644 --- a/lib/compiler.h +++ b/lib/compiler.h @@ -72,6 +72,16 @@ extern "C" { #endif #endif +#ifdef __INTELLISENSE__ +/* + * Fix Visual Studio Code error: attribute "constructor" does not take + * arguments. + * + * Caused by the macro `DEFINE_MTYPE_ATTR` in `lib/memory.h`. + */ +#pragma diag_suppress 1094 +#endif /* __INTELISENSE__ */ + #if __has_attribute(hot) # define _OPTIMIZE_HOT __attribute__((hot)) #else @@ -411,6 +421,35 @@ _Static_assert(sizeof(_uint64_t) == 8 && sizeof(_int64_t) == 8, #endif /* !__cplusplus */ #endif /* !_FRR_ATTRIBUTE_PRINTFRR */ +/* helper to get type safety/avoid casts on calls + * (w/o this, functions accepting all prefix types need casts on the caller + * side, which strips type safety since the cast will accept any pointer + * type.) + */ +#ifndef __cplusplus +#define prefixtype(uname, typename, fieldname) typename *fieldname; +#define TRANSPARENT_UNION __attribute__((transparent_union)) +#else +#define prefixtype(uname, typename, fieldname) \ + typename *fieldname; \ + uname(typename *x) \ + { \ + this->fieldname = x; \ + } +#define TRANSPARENT_UNION +#endif + +#ifdef __INTELLISENSE__ +/* + * Fix Visual Studio Code error: argument of type "struct prefix *" is + * incompatible with parameter of type "union prefixptr". + * + * This is caused by all functions having the transparent unions in the + * prototype. Example: `prefixptr` and `prefixconstptr` from `lib/prefix.h`. + */ +#pragma diag_suppress 167 +#endif /* __INTELISENSE__ */ + #ifdef __cplusplus } #endif diff --git a/lib/prefix.h b/lib/prefix.h index c67656cfd..7de8d7903 100644 --- a/lib/prefix.h +++ b/lib/prefix.h @@ -301,22 +301,6 @@ struct prefix_sg { struct in_addr grp; }; -/* helper to get type safety/avoid casts on calls - * (w/o this, functions accepting all prefix types need casts on the caller - * side, which strips type safety since the cast will accept any pointer - * type.) - */ -#ifndef __cplusplus -#define prefixtype(uname, typename, fieldname) \ - typename *fieldname; -#define TRANSPARENT_UNION __attribute__((transparent_union)) -#else -#define prefixtype(uname, typename, fieldname) \ - typename *fieldname; \ - uname(typename *x) { this->fieldname = x; } -#define TRANSPARENT_UNION -#endif - union prefixptr { prefixtype(prefixptr, struct prefix, p) prefixtype(prefixptr, struct prefix_ipv4, p4) |