On Jul 14, 2011, at 5:00 PM, Richard Trieu wrote:

> Author: rtrieu
> Date: Thu Jul 14 19:00:51 2011
> New Revision: 135222
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=135222&view=rev
> Log:
> Remove warnings of constant operands of logical operators from template 
> instantiations.  Upon instantiation of template, value-dependent parameters 
> are replaced by equivalent literals, so code like:
> 
> template<unsigned int A, unsigned int B> struct S {
>  int foo() {
>    int x = A && B;
>  }
> }
> 
> will not warn on A && B on every instantiation.  This will still warn on 
> other cases inside templates, which will be caught on checking the template 
> definition.
> 
> Modified:
>    cfe/trunk/lib/Sema/SemaExpr.cpp
>    cfe/trunk/test/SemaCXX/expressions.cpp
> 
> Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
> URL: 
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=135222&r1=135221&r2=135222&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaExpr.cpp Thu Jul 14 19:00:51 2011
> @@ -6528,8 +6528,8 @@
>   // is a constant.
>   if (lex.get()->getType()->isIntegerType() && 
> !lex.get()->getType()->isBooleanType() &&
>       rex.get()->getType()->isIntegerType() && !rex.get()->isValueDependent() 
> &&
> -      // Don't warn in macros.
> -      !Loc.isMacroID()) {
> +      // Don't warn in macros or template instantiations.
> +      !Loc.isMacroID() && ActiveTemplateInstantiations.empty()) {
>     // If the RHS can be constant folded, and if it constant folds to 
> something
>     // that isn't 0 or 1 (which indicate a potential logical operation that
>     // happened to fold to true/false) then warn.

This really doesn't seem like the right check, because this suppresses this 
warning in *all* template instantiations, even if the constant value was 
actually written as a constant value (but the other operand was something 
dependent, suppressing the warning at template definition time). IMO, the right 
approach would be to suppress this warning when the constant value itself was 
instantiated from something... although that's rather trickier to implement.

        - Doug
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to