diff options
author | Rong Xu <xur@google.com> | 2014-07-21 16:47:22 -0700 |
---|---|---|
committer | Rong Xu <xur@google.com> | 2014-07-29 15:31:03 -0700 |
commit | 38a8aecfb882072900434499696b5c32a2274515 (patch) | |
tree | 2aac97f0ae24b03cd98c1a06e989c031c173f889 /gcc-4.9/gcc/c-family | |
parent | c231900e5dcc14d8296bd9f62b45997a49d4d5e7 (diff) | |
download | toolchain_gcc-38a8aecfb882072900434499696b5c32a2274515.tar.gz toolchain_gcc-38a8aecfb882072900434499696b5c32a2274515.tar.bz2 toolchain_gcc-38a8aecfb882072900434499696b5c32a2274515.zip |
[4.9] Switch gcc-4.9 to use google/gcc-4_9 branch.
This source drop uses svn version r212828 of google/gcc-4.9 branch.
We also cherry-picked r213062, r213063 and r213064 to fix windows
build issues.
All gcc-4.9 patches before July 3rd are ported to google/gcc-4.9.
The following prior commits has not been merged to google branch yet.
(They are included in this commit).
e7af147f979e657fe2df00808e5b4319b0e088c6,
baf87df3cb2683649ba7e9872362a7e721117c23, and
c231900e5dcc14d8296bd9f62b45997a49d4d5e7.
Change-Id: I4bea3ea470387ff751c2be4cb0d4a12059b9299b
Diffstat (limited to 'gcc-4.9/gcc/c-family')
-rw-r--r-- | gcc-4.9/gcc/c-family/ChangeLog | 26 | ||||
-rw-r--r-- | gcc-4.9/gcc/c-family/c-common.c | 117 | ||||
-rw-r--r-- | gcc-4.9/gcc/c-family/c-common.h | 3 | ||||
-rw-r--r-- | gcc-4.9/gcc/c-family/c-cppbuiltin.c | 29 | ||||
-rw-r--r-- | gcc-4.9/gcc/c-family/c-gimplify.c | 4 | ||||
-rw-r--r-- | gcc-4.9/gcc/c-family/c-omp.c | 9 | ||||
-rw-r--r-- | gcc-4.9/gcc/c-family/c-opts.c | 126 | ||||
-rw-r--r-- | gcc-4.9/gcc/c-family/c-pragma.c | 2 | ||||
-rw-r--r-- | gcc-4.9/gcc/c-family/c.opt | 4 |
9 files changed, 293 insertions, 27 deletions
diff --git a/gcc-4.9/gcc/c-family/ChangeLog b/gcc-4.9/gcc/c-family/ChangeLog index 4f277de68..1fa0dd088 100644 --- a/gcc-4.9/gcc/c-family/ChangeLog +++ b/gcc-4.9/gcc/c-family/ChangeLog @@ -1,3 +1,29 @@ +2014-06-30 Jakub Jelinek <jakub@redhat.com> + + Backported from mainline + 2014-06-10 Jakub Jelinek <jakub@redhat.com> + + PR fortran/60928 + * c-pragma.c (omp_pragmas_simd): Move PRAGMA_OMP_TASK... + (omp_pragmas): ... back here. + +2014-06-12 Jakub Jelinek <jakub@redhat.com> + + PR middle-end/61486 + * c-omp.c (c_omp_split_clauses): Don't crash on firstprivate in + #pragma omp target teams or + #pragma omp {,target }teams distribute simd. + +2014-06-04 Marek Polacek <polacek@redhat.com> + + Backport from mainline + 2014-05-08 Marek Polacek <polacek@redhat.com> + + PR c/61053 + * c-common.c (min_align_of_type): New function factored out from... + (c_sizeof_or_alignof_type): ...here. + * c-common.h (min_align_of_type): Declare. + 2014-05-06 Richard Biener <rguenther@suse.de> * c-opts.c (c_common_post_options): For -freestanding, diff --git a/gcc-4.9/gcc/c-family/c-common.c b/gcc-4.9/gcc/c-family/c-common.c index f7f2bb3e3..65c25bf17 100644 --- a/gcc-4.9/gcc/c-family/c-common.c +++ b/gcc-4.9/gcc/c-family/c-common.c @@ -380,6 +380,13 @@ static tree handle_omp_declare_simd_attribute (tree *, tree, tree, int, static tree handle_omp_declare_target_attribute (tree *, tree, tree, int, bool *); +static tree handle_always_patch_for_instrumentation_attribute (tree *, tree, + tree, int, + bool *); +static tree handle_never_patch_for_instrumentation_attribute (tree *, tree, + tree, int, + bool *); + static void check_function_nonnull (tree, int, tree *); static void check_nonnull_arg (void *, tree, unsigned HOST_WIDE_INT); static bool nonnull_check_p (tree, unsigned HOST_WIDE_INT); @@ -758,6 +765,13 @@ const struct attribute_spec c_common_attribute_table[] = The name contains space to prevent its usage in source code. */ { "fn spec", 1, 1, false, true, true, handle_fnspec_attribute, false }, + { "always_patch_for_instrumentation", 0, 0, true, false, false, + handle_always_patch_for_instrumentation_attribute, + false }, + { "never_patch_for_instrumentation", 0, 0, true, false, false, + handle_never_patch_for_instrumentation_attribute, + false }, + { "warn_unused", 0, 0, false, false, false, handle_warn_unused_attribute, false }, { "returns_nonnull", 0, 0, false, true, true, @@ -4927,6 +4941,26 @@ c_common_get_alias_set (tree t) return -1; } +/* Return the least alignment required for type TYPE. */ + +unsigned int +min_align_of_type (tree type) +{ + unsigned int align = TYPE_ALIGN (type); + align = MIN (align, BIGGEST_ALIGNMENT); +#ifdef BIGGEST_FIELD_ALIGNMENT + align = MIN (align, BIGGEST_FIELD_ALIGNMENT); +#endif + unsigned int field_align = align; +#ifdef ADJUST_FIELD_ALIGN + tree field = build_decl (UNKNOWN_LOCATION, FIELD_DECL, NULL_TREE, + type); + field_align = ADJUST_FIELD_ALIGN (field, field_align); +#endif + align = MIN (align, field_align); + return align / BITS_PER_UNIT; +} + /* Compute the value of 'sizeof (TYPE)' or '__alignof__ (TYPE)', where the IS_SIZEOF parameter indicates which operator is being applied. The COMPLAIN flag controls whether we should diagnose possibly @@ -5005,21 +5039,7 @@ c_sizeof_or_alignof_type (location_t loc, size_int (TYPE_PRECISION (char_type_node) / BITS_PER_UNIT)); else if (min_alignof) - { - unsigned int align = TYPE_ALIGN (type); - align = MIN (align, BIGGEST_ALIGNMENT); -#ifdef BIGGEST_FIELD_ALIGNMENT - align = MIN (align, BIGGEST_FIELD_ALIGNMENT); -#endif - unsigned int field_align = align; -#ifdef ADJUST_FIELD_ALIGN - tree field = build_decl (UNKNOWN_LOCATION, FIELD_DECL, NULL_TREE, - type); - field_align = ADJUST_FIELD_ALIGN (field, field_align); -#endif - align = MIN (align, field_align); - value = size_int (align / BITS_PER_UNIT); - } + value = size_int (min_align_of_type (type)); else value = size_int (TYPE_ALIGN_UNIT (type)); } @@ -6867,6 +6887,7 @@ handle_unused_attribute (tree *node, tree name, tree ARG_UNUSED (args), if (TREE_CODE (decl) == PARM_DECL || TREE_CODE (decl) == VAR_DECL + || TREE_CODE (decl) == FIELD_DECL || TREE_CODE (decl) == FUNCTION_DECL || TREE_CODE (decl) == LABEL_DECL || TREE_CODE (decl) == TYPE_DECL) @@ -8680,6 +8701,47 @@ handle_nonnull_attribute (tree *node, tree ARG_UNUSED (name), return NULL_TREE; } +/* Handle a "always_patch_for_instrumentation" attribute; arguments as in + struct attribute_spec.handler. */ + +static tree +handle_always_patch_for_instrumentation_attribute (tree *node, tree name, + tree ARG_UNUSED (args), + int ARG_UNUSED (flags), + bool *no_add_attrs) +{ + if (TREE_CODE (*node) == FUNCTION_DECL) + { + /* Disable inlining if forced instrumentation. */ + DECL_UNINLINABLE (*node) = 1; + } + else + { + warning (OPT_Wattributes, "%qE attribute ignored", name); + *no_add_attrs = true; + } + return NULL_TREE; +} + + +/* Handle a "never_patch_for_instrumentation" attribute; arguments as in + struct attribute_spec.handler. */ + +static tree +handle_never_patch_for_instrumentation_attribute (tree *node, tree name, + tree ARG_UNUSED (args), + int ARG_UNUSED (flags), + bool *no_add_attrs) +{ + if (TREE_CODE (*node) != FUNCTION_DECL) + { + warning (OPT_Wattributes, "%qE attribute ignored", name); + *no_add_attrs = true; + } + return NULL_TREE; +} + + /* Check the argument list of a function call for null in argument slots that are marked as requiring a non-null pointer argument. The NARGS arguments are passed in the array ARGARRAY. @@ -11727,6 +11789,31 @@ keyword_is_decl_specifier (enum rid keyword) } } +/* Check for and warn about self-assignment or self-initialization. + LHS and RHS are the tree nodes for the left-hand side and right-hand side + of the assignment or initialization we are checking. + LOCATION is the source location for RHS. */ + +void +check_for_self_assign (location_t location, tree lhs, tree rhs) +{ + if (lhs == NULL_TREE || rhs == NULL_TREE) + return; + + /* Deal with TREE_LIST initializers (may be generated by class + member initialization in C++). */ + if (TREE_CODE (rhs) == TREE_LIST) + rhs = TREE_VALUE (rhs); + + /* Only emit a warning if RHS is not a folded expression so that we don't + warn on something like x = x / 1. */ + if (!EXPR_FOLDED (rhs) + && operand_equal_p (lhs, rhs, + OEP_PURE_SAME | OEP_ALLOW_NULL | OEP_ALLOW_NO_TYPE)) + warning_at (location, OPT_Wself_assign, G_("%qE is assigned to itself"), + lhs); +} + /* Initialize language-specific-bits of tree_contains_struct. */ void diff --git a/gcc-4.9/gcc/c-family/c-common.h b/gcc-4.9/gcc/c-family/c-common.h index 24959d83e..fe798fa6d 100644 --- a/gcc-4.9/gcc/c-family/c-common.h +++ b/gcc-4.9/gcc/c-family/c-common.h @@ -758,6 +758,7 @@ extern tree c_wrap_maybe_const (tree, bool); extern tree c_save_expr (tree); extern tree c_common_truthvalue_conversion (location_t, tree); extern void c_apply_type_quals_to_decl (int, tree); +extern unsigned int min_align_of_type (tree); extern tree c_sizeof_or_alignof_type (location_t, tree, bool, bool, int); extern tree c_alignof_expr (location_t, tree); /* Print an error message for invalid operands to arith operation CODE. @@ -830,6 +831,7 @@ extern bool c_common_post_options (const char **); extern bool c_common_init (void); extern void c_common_finish (void); extern void c_common_parse_file (void); +extern FILE *get_dump_info (int, int *); extern alias_set_type c_common_get_alias_set (tree); extern void c_register_builtin_type (tree, const char*); extern bool c_promoting_integer_type_p (const_tree); @@ -1012,6 +1014,7 @@ extern void release_tree_vector (vec<tree, va_gc> *); extern vec<tree, va_gc> *make_tree_vector_single (tree); extern vec<tree, va_gc> *make_tree_vector_from_list (tree); extern vec<tree, va_gc> *make_tree_vector_copy (const vec<tree, va_gc> *); +extern void check_for_self_assign (location_t, tree, tree); /* In c-gimplify.c */ extern void c_genericize (tree); diff --git a/gcc-4.9/gcc/c-family/c-cppbuiltin.c b/gcc-4.9/gcc/c-family/c-cppbuiltin.c index 2f2e7bae8..6a697f666 100644 --- a/gcc-4.9/gcc/c-family/c-cppbuiltin.c +++ b/gcc-4.9/gcc/c-family/c-cppbuiltin.c @@ -969,6 +969,33 @@ c_cpp_builtins (cpp_reader *pfile) if (c_dialect_cxx () && TYPE_UNSIGNED (wchar_type_node)) cpp_define (pfile, "__WCHAR_UNSIGNED__"); + /* Tell source code if the compiler makes sync_compare_and_swap + builtins available. */ +#ifdef HAVE_sync_compare_and_swapqi + if (HAVE_sync_compare_and_swapqi) + cpp_define (pfile, "__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1"); +#endif + +#ifdef HAVE_sync_compare_and_swaphi + if (HAVE_sync_compare_and_swaphi) + cpp_define (pfile, "__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2"); +#endif + +#ifdef HAVE_sync_compare_and_swapsi + if (HAVE_sync_compare_and_swapsi) + cpp_define (pfile, "__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4"); +#endif + +#ifdef HAVE_sync_compare_and_swapdi + if (HAVE_sync_compare_and_swapdi) + cpp_define (pfile, "__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8"); +#endif + +#ifdef HAVE_sync_compare_and_swapti + if (HAVE_sync_compare_and_swapti) + cpp_define (pfile, "__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16"); +#endif + cpp_atomic_builtins (pfile); #ifdef DWARF2_UNWIND_INFO @@ -1028,6 +1055,8 @@ c_cpp_builtins (cpp_reader *pfile) format. */ if (ENABLE_DECIMAL_FLOAT && ENABLE_DECIMAL_BID_FORMAT) cpp_define (pfile, "__DECIMAL_BID_FORMAT__"); + if (c_dialect_cxx () && flag_sized_delete) + cpp_define (pfile, "__GXX_DELETE_WITH_SIZE__"); } /* Pass an object-like macro. If it doesn't lie in the user's diff --git a/gcc-4.9/gcc/c-family/c-gimplify.c b/gcc-4.9/gcc/c-family/c-gimplify.c index 737be4d72..d385f3a40 100644 --- a/gcc-4.9/gcc/c-family/c-gimplify.c +++ b/gcc-4.9/gcc/c-family/c-gimplify.c @@ -80,7 +80,7 @@ c_genericize (tree fndecl) struct cgraph_node *cgn; /* Dump the C-specific tree IR. */ - dump_orig = dump_begin (TDI_original, &local_dump_flags); + dump_orig = get_dump_info (TDI_original, &local_dump_flags); if (dump_orig) { fprintf (dump_orig, "\n;; Function %s", @@ -97,8 +97,6 @@ c_genericize (tree fndecl) else print_c_tree (dump_orig, DECL_SAVED_TREE (fndecl)); fprintf (dump_orig, "\n"); - - dump_end (TDI_original, dump_orig); } /* Dump all nested functions now. */ diff --git a/gcc-4.9/gcc/c-family/c-omp.c b/gcc-4.9/gcc/c-family/c-omp.c index dd0a45d96..6a0e41988 100644 --- a/gcc-4.9/gcc/c-family/c-omp.c +++ b/gcc-4.9/gcc/c-family/c-omp.c @@ -789,8 +789,13 @@ c_omp_split_clauses (location_t loc, enum tree_code code, else if ((mask & (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NUM_TEAMS)) != 0) { - /* This must be #pragma omp {,target }teams distribute. */ - gcc_assert (code == OMP_DISTRIBUTE); + /* This must be one of + #pragma omp {,target }teams distribute + #pragma omp target teams + #pragma omp {,target }teams distribute simd. */ + gcc_assert (code == OMP_DISTRIBUTE + || code == OMP_TEAMS + || code == OMP_SIMD); s = C_OMP_CLAUSE_SPLIT_TEAMS; } else if ((mask & (OMP_CLAUSE_MASK_1 diff --git a/gcc-4.9/gcc/c-family/c-opts.c b/gcc-4.9/gcc/c-family/c-opts.c index 29e9a355b..60d7145b7 100644 --- a/gcc-4.9/gcc/c-family/c-opts.c +++ b/gcc-4.9/gcc/c-family/c-opts.c @@ -43,6 +43,10 @@ along with GCC; see the file COPYING3. If not see TARGET_FLT_EVAL_METHOD_NON_DEFAULT and TARGET_OPTF. */ #include "tm_p.h" /* For C_COMMON_OVERRIDE_OPTIONS. */ +#include "function.h" +#include "params.h" +#include "l-ipo.h" +#include "dumpfile.h" #ifndef DOLLARS_IN_IDENTIFIERS # define DOLLARS_IN_IDENTIFIERS true @@ -102,6 +106,14 @@ static size_t deferred_count; /* Number of deferred options scanned for -include. */ static size_t include_cursor; +static bool parsing_done_p = false; + +/* Dump files/flags to use during parsing. */ +static FILE *original_dump_file = NULL; +static int original_dump_flags; +static FILE *class_dump_file = NULL; +static int class_dump_flags; + /* Whether any standard preincluded header has been preincluded. */ static bool done_preinclude; @@ -199,8 +211,10 @@ c_common_init_options_struct (struct gcc_options *opts) opts->x_warn_write_strings = c_dialect_cxx (); opts->x_flag_warn_unused_result = true; - /* By default, C99-like requirements for complex multiply and divide. */ - opts->x_flag_complex_method = 2; + /* By default, C99-like requirements for complex multiply and divide. + But for C++ this should not be required. */ + if (c_language != clk_cxx) + opts->x_flag_complex_method = 2; } /* Common initialization before calling option handlers. */ @@ -845,6 +859,10 @@ c_common_post_options (const char **pfilename) else if (!flag_gnu89_inline && !flag_isoc99) error ("-fno-gnu89-inline is only supported in GNU99 or C99 mode"); + if (flag_dyn_ipa && cpp_opts->preprocessed) + error ("-fpreprocessed/-save-temps are not supported with -fripa"); + + /* Default to ObjC sjlj exception handling if NeXT runtime. */ if (flag_objc_sjlj_exceptions < 0) flag_objc_sjlj_exceptions = flag_next_runtime; @@ -1051,6 +1069,34 @@ c_common_init (void) return true; } +/* Return TRUE if the lipo maximum memory consumption limit is reached, and + we should not import any further auxiliary modules. Check after parsing + each module, the Ith module being the just parsed module. */ +static bool +lipo_max_mem_reached (unsigned int i) +{ + if (L_IPO_COMP_MODE && PARAM_VALUE (PARAM_MAX_LIPO_MEMORY) + && i < (num_in_fnames - 1) + /* Scale up memory usage by 25% to account for memory consumption + by the optimizer. */ + && ((ggc_total_allocated () >> 10) * 1.25 + > (size_t) PARAM_VALUE (PARAM_MAX_LIPO_MEMORY))) { + if (dump_enabled_p ()) + { + i++; + do { + dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, input_location, + "Not importing %s: maximum memory " + "consumption reached", in_fnames[i]); + i++; + } while (i < num_in_fnames); + } + return true; + } + return false; +} + + /* Initialize the integrated preprocessor after debug output has been initialized; loop over each input file. */ void @@ -1062,9 +1108,26 @@ c_common_parse_file (void) for (;;) { c_finish_options (); + /* Open the dump files to use for the original and class dump output + here, to be used during parsing for the current file. */ + original_dump_file = dump_begin (TDI_original, &original_dump_flags); + class_dump_file = dump_begin (TDI_class, &class_dump_flags); pch_init (); + set_lipo_c_parsing_context (parse_in, i, verbose); push_file_scope (); c_parse_file (); + if (i == 0 && flag_record_compilation_info_in_elf) + write_compilation_flags_to_asm (); + + if (i == 0) + ggc_total_memory = (ggc_total_allocated () >> 10); + + /* In lipo mode, processing too many auxiliary files will cause us + to hit memory limits, and cause thrashing -- prevent this by not + processing any further auxiliary modules if we reach a certain + memory limit. */ + if (!include_all_aux && lipo_max_mem_reached (i)) + num_in_fnames = i + 1; pop_file_scope (); /* And end the main input file, if the debug writer wants it */ if (debug_hooks->start_end_main_source_file) @@ -1073,13 +1136,50 @@ c_common_parse_file (void) break; cpp_undef_all (parse_in); cpp_clear_file_cache (parse_in); + deferred_count = 0; this_input_filename = cpp_read_main_file (parse_in, in_fnames[i]); + if (original_dump_file) + { + dump_end (TDI_original, original_dump_file); + original_dump_file = NULL; + } + if (class_dump_file) + { + dump_end (TDI_class, class_dump_file); + class_dump_file = NULL; + } /* If an input file is missing, abandon further compilation. cpplib has issued a diagnostic. */ if (!this_input_filename) break; } + parsing_done_p = true; +} + +/* Returns true if parsing is done */ + +bool +is_parsing_done_p (void) +{ + return parsing_done_p; +} + +/* Returns the appropriate dump file for PHASE to dump with FLAGS. */ +FILE * +get_dump_info (int phase, int *flags) +{ + gcc_assert (phase == TDI_original || phase == TDI_class); + if (phase == TDI_original) + { + *flags = original_dump_flags; + return original_dump_file; + } + else + { + *flags = class_dump_flags; + return class_dump_file; + } } /* Common finish hook for the C, ObjC and C++ front ends. */ @@ -1089,7 +1189,11 @@ c_common_finish (void) FILE *deps_stream = NULL; /* Don't write the deps file if there are errors. */ - if (cpp_opts->deps.style != DEPS_NONE && !seen_error ()) + /* FIXME. We are emitting the deps file even if there were errors. + This is a temporary workaround to avoid confusing Google's build + system. It assumes that deps files are always emitted even + in the presence of errors. */ + if (cpp_opts->deps.style != DEPS_NONE /*&& !seen_error ()*/) { /* If -M or -MM was seen without -MF, default output to the output stream. */ @@ -1313,9 +1417,15 @@ c_finish_options (void) struct deferred_opt *opt = &deferred_opts[i]; if (opt->code == OPT_D) - cpp_define (parse_in, opt->arg); + { + cpp_define (parse_in, opt->arg); + coverage_note_define (opt->arg, true); + } else if (opt->code == OPT_U) - cpp_undef (parse_in, opt->arg); + { + cpp_undef (parse_in, opt->arg); + coverage_note_define (opt->arg, false); + } else if (opt->code == OPT_A) { if (opt->arg[0] == '-') @@ -1338,6 +1448,7 @@ c_finish_options (void) if (opt->code == OPT_imacros && cpp_push_include (parse_in, opt->arg)) { + coverage_note_include (opt->arg); /* Disable push_command_line_include callback for now. */ include_cursor = deferred_count + 1; cpp_scan_nooutput (parse_in); @@ -1382,7 +1493,10 @@ push_command_line_include (void) if (!cpp_opts->preprocessed && opt->code == OPT_include && cpp_push_include (parse_in, opt->arg)) - return; + { + coverage_note_include (opt->arg); + return; + } } if (include_cursor == deferred_count) diff --git a/gcc-4.9/gcc/c-family/c-pragma.c b/gcc-4.9/gcc/c-family/c-pragma.c index 9e2a00eb1..ad115e998 100644 --- a/gcc-4.9/gcc/c-family/c-pragma.c +++ b/gcc-4.9/gcc/c-family/c-pragma.c @@ -1188,6 +1188,7 @@ static const struct omp_pragma_def omp_pragmas[] = { { "section", PRAGMA_OMP_SECTION }, { "sections", PRAGMA_OMP_SECTIONS }, { "single", PRAGMA_OMP_SINGLE }, + { "task", PRAGMA_OMP_TASK }, { "taskgroup", PRAGMA_OMP_TASKGROUP }, { "taskwait", PRAGMA_OMP_TASKWAIT }, { "taskyield", PRAGMA_OMP_TASKYIELD }, @@ -1200,7 +1201,6 @@ static const struct omp_pragma_def omp_pragmas_simd[] = { { "parallel", PRAGMA_OMP_PARALLEL }, { "simd", PRAGMA_OMP_SIMD }, { "target", PRAGMA_OMP_TARGET }, - { "task", PRAGMA_OMP_TASK }, { "teams", PRAGMA_OMP_TEAMS }, }; diff --git a/gcc-4.9/gcc/c-family/c.opt b/gcc-4.9/gcc/c-family/c.opt index 2abf66cb7..9e0a9a410 100644 --- a/gcc-4.9/gcc/c-family/c.opt +++ b/gcc-4.9/gcc/c-family/c.opt @@ -331,6 +331,10 @@ Wconversion-null C++ ObjC++ Var(warn_conversion_null) Init(1) Warning Warn for converting NULL from/to a non-pointer type +Wself-assign-non-pod +C++ ObjC++ Var(warn_self_assign_non_pod) Init(0) Warning +Warn when a variable of a non-POD type is assigned to itself + Wctor-dtor-privacy C++ ObjC++ Var(warn_ctor_dtor_privacy) Warning Warn when all constructors and destructors are private |